我正在 macOS 上使用 PyObjC 编写 Python 脚本来与联系人框架交互。我创建了一个简单的类来封装联系人创建、设置
givenName
属性,并将其保存到联系人应用程序。
当我在
givenName
对象上设置 CNMutableContact
时,Python 会抛出一个 AttributeError
,声称 givenName
属性是只读的。
simplecontact.py
:#!/usr/bin/env python3
import objc
from Contacts import CNMutableContact, CNContactStore, CNSaveRequest
class SimpleContact:
def __init__(self, first_name):
self.contact = CNMutableContact.new()
self.contact.givenName = first_name
def save(self):
store = CNContactStore.alloc().init()
request = CNSaveRequest.alloc().init()
request.addContact_toContainerWithIdentifier_(self.contact, None)
error = objc.nil
store.executeSaveRequest_error_(request, error)
if error is not objc.nil:
print(f"Failed to save contact: \n{error}")
else:
print("Contact saved successfully.")
if __name__ == "__main__":
simple_contact = SimpleContact("John99999")
simple_contact.save()
➜ python simplecontact.py
Traceback (most recent call last):
File "~/Desktop/simple-contact/simplecontact.py", line 25, in <module>
simple_contact = SimpleContact("John99999")
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "~/Desktop/simple-contact/simplecontact.py", line 9, in __init__
self.contact.givenName = first_name
^^^^^^^^^^^^^^^^^^^^^^
AttributeError: 'CNMutableContact' object attribute 'givenName' is read-only
我希望能够按照联系人框架文档在
givenName
对象上设置 CNMutableContact
属性而不会出现问题。
这是 PyObjC 的问题吗?或者我是否遗漏了如何在 Python 中处理
CNMutableContact
属性?
任何见解或解决方法将不胜感激! 🙏
您应该使用 setter 方法来设置字段,如下所示:
class SimpleContact:
def __init__(self, first_name):
self.contact = CNMutableContact.new()
self.contact.setGivenName_(first_name)
一些背景:PyObjC 本身不公开 ObjC 属性,而仅公开单独的访问器方法(getter 和 setter)。原因很简单:在 ObjC 中,属性和方法位于不同的命名空间中,而在 Python 中,类对于所有类型的属性都有一个命名空间。
我正在考虑在 PyObjC 的未来版本中更改此设置,但默认值更改需要数年时间,因为这对于使用 PyObjC 的代码来说将是一个重大更改。