我正在学习@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
答案 0 :(得分:3)
从类中访问属性时,不会忽略装饰器。所以当width()
方法
return self.width
再次调用width()
方法,尝试调用方法的return self.width
,依此类推。
这就是为什么你需要为类内部的属性使用不同的名称而不是装饰器方法的名称。
@property
def width(self):
return self._width
访问_width
属性不会尝试使用修饰方法,因此您不会进入无限递归。