使用 PyObjC 在 Python 中设置 CNMutableContact 上的给定名称时出现 AttributeError

问题描述 投票:0回答:1

我正在 macOS 上使用 PyObjC 编写 Python 脚本来与联系人框架交互。我创建了一个简单的类来封装联系人创建、设置

givenName
属性,并将其保存到联系人应用程序。

当我在

givenName
对象上设置
CNMutableContact
时,Python 会抛出一个
AttributeError
,声称
givenName
属性是只读的。

SimpleContact Python 类
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

环境信息:

  • Python版本:3.11.8
  • macOS 版本:14.3.1(内部版本 23D60)

相关软件包版本:

  • pyobjc==10.2
  • pyobjc-core==10.2
  • pyobjc-framework-联系人==10.2

我希望能够按照联系人框架文档在

givenName
对象上设置
CNMutableContact
属性而不会出现问题。

这是 PyObjC 的问题吗?或者我是否遗漏了如何在 Python 中处理

CNMutableContact
属性?

任何见解或解决方法将不胜感激! 🙏

contacts pyobjc cncontactstore cnmutablecontact pyobjc-framework-contacts
1个回答
0
投票

您应该使用 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 的代码来说将是一个重大更改。

© www.soinside.com 2019 - 2024. All rights reserved.