2016-04-29 89 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