2016-04-29 63 views
1

下面是測試類,我寫的逐漸熟悉了@propertiessetter功能在Python腳本:使用屬性造成「最大遞歸深度超過」

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

使用'self._x'而不是'self.x'作爲私人成員。通過命名成員和屬性'x'屬性陰影成員,並且'get self.x'在getter體內調用它自己。 –

回答

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方法中的私有變量'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

相關問題