2017-08-27 5 views
0

私のコードとセッター/ゲッターメソッドを呼び出すために知っているん:どうPythonは性質

RecursionError: maximum recursion depth exceeded 

私の質問:私は次の出力を得る

class MyClass: 

    def __init__(self): 
     self.value = 0 

    def set_value(self, value): 
     self.value = 5 

    def get_value(self): 
     return self.value 

    value = property(get_value, set_value) 

a = MyClass() 

は、なぜ私はこの出力を得るのですか? インスタンス変数を0に設定するのではなく、なぜPythonは MyClass.value .__ set__を呼び出すのですか?

私はプロパティオブジェクトがクラス変数であることを意味し、aインスタンスを初期化するときには、私はクラス変数で何もしません。あなたが私の言いたいことを知っていたらいいなあ

+0

興味深い出力、私はそれを期待していないでしょう。ちょうど 'value'をプライベート変数(' __value'に置き換えて)にすることで問題を解決するということを追加したいと思います。 – Michael

+1

@Michaelはそれを秘密にしません。プロパティの背後にある属性が異なる名前(通常は*単一の先頭のアンダースコアであるが、完全に異なるものでもよい)である限り、再帰はありません。 – jonrsharpe

+1

プロパティがどのように動作するかは*であるため、 'MyClass.value .__ set____'を呼び出します。それ以外の場合は、割り当てられたときにすぐにそのプロパティをただちに値に置き換えます。 – jonrsharpe

答えて

0

value = property(get_value, set_value)を実行すると、新しいディスクリプタが宣言されます。今からinstance.valueinstance.value = x.get_value().set_value()となります。

+0

ここに理由があります:https://stackoverflow.com/a/36607870/5005715 – Aliquis