ここ

2016-04-29 5 views
1

を「最大の再帰の深さを超えて、」私はPythonスクリプトで@propertiessetter機能に精通になったために書いたテストクラスである:問題ここ

class Test(object): 
    def __init__(self, value): 
     self.x = value 
    @property 
    def x(self): 
     return self.x 
    @x.setter 
    def x(self, value): 
     self.x = value 

は私がしたいときということです私のクラスからオブジェクトを作成し、私は次のエラーに直面:

>>> t = Test(1) 

Traceback (most recent call last): 
    File "<pyshell#19>", line 1, in <module> 
    t = Test(1) 
    File "<pyshell#18>", line 3, in __init__ 
    self.x = value 
    File "<pyshell#18>", line 9, in x 
    self.x = value 
    File "<pyshell#18>", line 9, in x 
    #A bunch of lines skipped 
RuntimeError: maximum recursion depth exceeded 
>>> 
+0

privateメンバーに 'self.x'の代わりに' self._x'を使用してください。メンバとプロパティの 'x'プロパティシャドーメンバの両方に名前を付けることで、ゲッター本体の' return self.x'はそれ自身を呼び出します。 –

答えて

4

getter、setter、およびattributeに同じ名前を使用しています。プロパティを設定するときは、属性の名前をローカルに変更する必要があります。大会では、接頭辞の先頭にアンダースコアを付けます。

class Test(object): 
    def __init__(self, value): 
     self._x = value 

    @property 
    def x(self): 
     return self._x 
+0

ありがとうございます。 _Byte Commander_の答えを見てください[ここ](http://stackoverflow.com/questions/36929460/how-to-keep-variable-and-dictionary-that-c​​ontains-it-consistent/36930474?noredirect=1# comment61422678_36930474)。彼は 'setter'、' getter'と 'variable'に同じ名前を使用しましたが、彼のプログラムはうまくいきます。 – EbraHim

+0

setterメソッドを定義した場合は、getter/setter/deleterメソッドのprivate変数 'self._x'にのみアクセスする方が良いでしょう。 \ _ \ _ init__では 'self.x = value'と言うことができます。 – Rob

+0

@Rob正しいことが分かりません。なぜそれは良いですか?私が知っている大会ではありません。 –

1

問題は、これらの行にあります。

def x(self): 
    return self.x 

今機能が超える再帰の深さにつながる、自分自身を呼び出すため

def get_x(self): 
    return self.x 

に交換してください。

+0

'@ properties'を使いたいです。 – EbraHim