使用@property装饰器时的RecursionError

时间:2017-05-02 18:49:11

标签: python python-3.x

我正在学习@property操作并编写如下代码,而cmd只是显示,

Traceback (most recent call last):
File "C:\Users\mckf1\pyfile\new.py", line 23, in <module>
s.width=1024
File "C:\Users\mckf1\pyfile\new.py", line 9, in width
self.width=value1
File "C:\Users\mckf1\pyfile\new.py", line 9, in width
self.width=value1
File "C:\Users\mckf1\pyfile\new.py", line 9, in width
self.width=value1
[Previous line repeated 495 more times]
RecursionError: maximum recursion depth exceeded

但是,在参数前面添加一个下划线(宽度,高度,分辨率)之后,代码通常会正常工作。我不明白为什么。

class Screen(object):
    @property
    def width(self):
        return self.width
    @width.setter
    def width(self,value1):
        if value1<=10 or value1>=10000:
            print(value1,'is not a proper width')
        else:
            self.width=value1
    @property
    def height(self):
        return self.height
    @height.setter
    def height(self,value2):
        if value2<=5 or value2>=5000:
            print(value2,'is not a proper height')
        else:
            self.height=value2
    @property
    def resolution(self):
        self.resolution=self.width*self.height
        print(self.width,'*',self.height,'= %d'%self.resolution)
s=Screen()
s.width=1024
s.height=768
s.resolution

1 个答案:

答案 0 :(得分:3)

从类中访问属性时,不会忽略装饰器。所以当width()方法

return self.width

再次调用width()方法,尝试调用方法的return self.width,依此类推。

这就是为什么你需要为类内部的属性使用不同的名称而不是装饰器方法的名称。

@property
def width(self):
    return self._width

访问_width属性不会尝试使用修饰方法,因此您不会进入无限递归。