属性属性更改时运行setter

时间:2017-09-07 09:31:34

标签: python-3.6

我想使用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

1 个答案:

答案 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。如果您需要更多帮助,请提供更详细的示例。