使用PyObjC操作CNMutableContact时设置givenName遇AttributeError
解决PyObjC操作CNMutableContact时givenName只读的问题
问题原因
在PyObjC中,部分Cocoa框架的属性无法直接通过Python点语法赋值,需调用对应的Objective-C setter方法。CNMutableContact的givenName属性属于这类情况,直接用obj.givenName = value会触发只读错误,实际要通过setGivenName_()方法完成赋值。同时原代码的错误处理逻辑也存在问题,PyObjC中错误参数需通过指针传递才能正确获取错误信息。
修正后的代码
#!/usr/bin/env python3 import objc from Contacts import CNMutableContact, CNContactStore, CNSaveRequest class SimpleContact: def __init__(self, first_name): self.contact = CNMutableContact.new() # 使用Objective-C setter方法设置givenName self.contact.setGivenName_(first_name) def save(self): store = CNContactStore.alloc().init() request = CNSaveRequest.alloc().init() request.addContact_toContainerWithIdentifier_(self.contact, None) # 正确处理错误参数 error_ptr = objc.NULL success = store.executeSaveRequest_error_(request, error_ptr) if not success: error = error_ptr[0] print(f"Failed to save contact: \n{error}") else: print("Contact saved successfully.") if __name__ == "__main__": simple_contact = SimpleContact("John99999") simple_contact.save()
关键修改点
- 替换赋值方式:将
self.contact.givenName = first_name改为self.contact.setGivenName_(first_name),对应Objective-C中的[contact setGivenName:first_name]调用,是PyObjC与Objective-C属性交互的标准方式。 - 修正错误处理:使用
objc.NULL作为错误指针,通过方法返回值判断操作是否成功,再从指针中取出错误对象。
额外注意事项
运行脚本前需确保终端或使用的IDE已获得通讯录访问权限,可在系统偏好设置 > 隐私与安全性 > 通讯录中开启权限。
内容的提问来源于stack exchange,提问作者hernamesbarbara
相关产品推荐
相关产品推荐

