2017-06-13 11 views
1

コードget__:違い__、__

class Pizza: 
    def __init__(self, toppings): 
    self.toppings = toppings 
    self._pineapple_allowed = False 

    @property 
    def pineapple_allowed(self): 
    return self._pineapple_allowed 

    @pineapple_allowed.setter 
    def pineapple_allowed(self, value): 
    if value: 
     password = input("Enter the password: ") 
     if password == "Sw0rdf1sh!": 
     self._pineapple_allowed = value 
     else: 
     raise ValueError("Alert! Intruder!") 

を私は@<func>.setterデコレータは単なるオブジェクトで__set__機能を上書きするとどのように異なるか混乱しています。 @<func>.getterおよび__get__と同じです。

そのため、クラス内の変数を設定するだけでは、@propertyの使用例は考えられません。

私はこれについてすべて間違っていると思いますか? __get__, __set__ and __delete__が記述プロトコル自体の魔法の方法ですしながら、あなたは、あなたのケースcls.pineapple_allowedには、単一のクラス属性を制御する「@property」ディスクリプタに

答えて

1

。上記のメソッドをいずれかのクラスで上書きすると、ANYクラス属性のアクセス/割り当て/削除は、対応する魔法のメソッドを経由します。

1

私は@<func>.setterデコレータは単なるオブジェクトで__set__機能を上書きするとどのように異なるか混乱しています。 @<func>.getterおよび__get__と同じです。属性を実行するときにPythonが__set__を見つけるために、プロパティオブジェクトのクラスに直接行くので、あなたが直接プロパティオブジェクトに__set__メソッドを上書きすることはできない、とあなたは、それは何もしないだろうことができても、

割り当て。これは、Pythonが言語機能の実装としてそれらを探しているときに、ほとんどの二重二重下線のメソッドになります。

を使用する代わりに.setterを使用すると、プロパティオブジェクトのインスタンス属性に関数が記録されます。__set__は、その設定を行うために委任します。