2017-09-07 67 views
-1

我想使用python setter函數(最終將元數據粘貼到對象上)。該方法的工作原理,當完整的屬性更改,但它不會當屬性屬性的變化:當屬性屬性發生變化時運行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"})` 

二傳手叫!

2 - 更改屬性props

myobject.props = {"name": "anyone else"} 

二傳手叫!

3 - 更改屬性的屬性:

myobject.props['name'] = "yet anyone else" 

,這不運行的setter

回答

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 不會工作內部改變可變對象。

您可能需要提供您自己的課程道具或使用observer pattern。如果您需要更多幫助,請提供更詳細的示例。

相關問題