2017-09-07 13 views
-1

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"})` 

をセッターと呼ばれる!

2 - 変更属性props:呼ば

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

セッター!

3 - 変更はプロパティ属性:

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

をして、これはあなたがそれが必要だと思うようには動作しない第3の状況ではセッター

答えて

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! 

セッターが呼び出されます。あなたが提供した場合、まず、プロパティメソッドを使って小道具に辞書を添付して、キーの1つに新しい値を設定します。 Setter は、では可変オブジェクトを内部で変更することはできません。

おそらく、小道具に独自のクラスを指定するか、observer patternを使用する必要があります。より多くのヘルプを必要とする場合は、より詳細な例を提供します。

関連する問題