我想使用python setter函数(最终将元数据粘贴到对象上)。该方法在完整属性发生变化时起作用,但在属性变化时却不起作用。属性更改:
MWE
class MyObject():
def __init__(self, props):
self.props = props
@property
def props(self):
return self._props
@props.setter
def props(self, p):
print("setter called!")
self._props = p
1 - 初始化对象:
myobject = MyObject(props={"name": "API"})`
setter叫!
2 - 更改属性props
:
myobject.props = {"name": "anyone else"}
setter叫!
3 - 更改属性'属性:
myobject.props['name'] = "yet anyone else"
这不会运行setter
答案 0 :(得分:0)
在第三种情况下,它无法正常运作。
In [1]: class MyObject():
...: def __init__(self, props):
...: self.props = props
...:
...: @property
...: def props(self):
...: print("property called!")
...: return self._props
...:
...: @props.setter
...: def props(self, p):
...: print("setter called!")
...: self._props = p
...:
In [2]: myobject.props['name'] = "yet anyone else"
property called!
当您尝试将新对象分配给道具时,会调用Setter。在您提供的情况下,首先通过属性方法将props附加到props,然后为其中一个键设置新值。 Setter 不会用于更改内部的可变对象。
您可能需要为道具提供自己的课程或使用observer pattern。如果您需要更多帮助,请提供更详细的示例。