gpt4 book ai didi

python - 如何覆盖类似字典的对象的属性设置?

转载 作者:行者123 更新时间:2023-11-30 23:54:23 29 4
gpt4 key购买 nike

我正在编写一个 C 绑定(bind),并且我正在包装的 C 结构具有一些字符串索引的属性值。

我想将它们公开为 python 中的字典。

到目前为止,我已经有了一个函数get_properties,它将所有对象的属性作为单个字典返回。我在类定义中使用 property 函数将其包装起来,以便我可以将其作为类属性进行访问:

(在类定义中)

class MyClass:
def get_properties(self):
...
properties = property(get_properties)

(示例)

>>> print myobj.properties
{'test': 5, 'test2': 'string'}

现在,我想以类似字典的方式处理设置它们。我有一个名为 set_property 的 C 函数包装函数,它接受一个字符串键和多种类型的值。

我尝试使用我的类 property 中的 set_properties:

class MyClass:
def get_properties(self):
...
def set_property(self, key, value):
...
def set_properties(self, props):
[self.set_property(k, props[k]) for k in props]
properties = property(get_properties, set_properties)

其工作原理如下:

>>> myobj.properties = {"test3": 6}
>>> print myobj.properties
{'test': 5, 'test2': 'string', 'test3': 6}

但是,正如您所看到的,这并不完全是预期的行为。我更喜欢的是这样的:

>>> myobj.properties['test3'] = 6

我尝试将 __setitem__ 的定义添加到 properties:

class MyClass:
...
properties = property(get_properties)
properties.__setitem__ = set_property

但这让我着迷,

AttributeError: 'property' object has no attribute '__setitem__'

我尝试将属性设置为字典并简单地覆盖 __setitem____getitem__ 但它没有它。

知道执行此操作的正确方法是什么吗?我可以使类属性表现得像字典吗?

谢谢。

最佳答案

好吧,迈克的回答给了我解决这个问题的想法,通过使用扩展的 dict 类从属性的 getter 返回,我在其中根据上下文重写 __setitem__ :

class MyClass(object):
def get_properties():
... (call C function and convert to dict)
def set_property():
... (call C function)
def propgetter(self):
context = self
props = self.get_properties()
class propsetter(dict):
__getitem__ = props.__getitem__
def __setitem__(self, key, value):
props[key] = value
context.set_property(key, value)
return propsetter(self.get_properties())
properties = property(propgetter)

似乎按我想要的方式工作。

关于python - 如何覆盖类似字典的对象的属性设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146170/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com