通过板砖学习大佬的编程思想,感谢大佬
Topic source借楼:求大佬解答下:
class Screen(object):
@property
def width(self):
return self.width
@width.setter
def width(self, value):
self.width = value
@property
def height(self):
return self.height
@height.setter
def height(self,value2):
self.height = value2
@property
def resolution(self):
return self.width * self.height
这样写测试就不通过,但是把width 和height声明为私有属性就能测试通过,为啥呢?下面这样就能测试通过,求解:
class Screen(object):
@property
def width(self):
return self.__width
@width.setter
def width(self, value):
self.__width = value
@property
def height(self):
return self.__height
@height.setter
def height(self,value2):
self.__height = value2
@property
def resolution(self):
return self.__width * self.__height
要特别注意:属性的方法名不要和实例变量重名。例如,以下的代码是错误的:
class Student(object):
# 方法名称和实例变量均为birth:
@property
def birth(self):
return self.birth
这是因为调用s.birth
时,首先转换为方法调用,在执行return self.birth
时,又视为访问self
的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError
。
以上是原文的原话,多读几遍,然后对比你自己的代码
- 1
老师我是杰同学
#------------------------@property test2-------------------------
class screen(object):
def __init__(self):
self._resolution = 786432
@property
def width(self):
return self._width
@width.setter
def width(self,value):
if not isinstance(value,(int,float)):
raise ValueError('bad width')
self._width = value
@property
def height(self):
return self._height
@height.setter
def height(self,value):
if not isinstance(value,(int,float)):
raise ValueError('bad height')
self._height = value
@property
def resolution(self):
return self._resolution
# 测试:
s = screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
#---------------------------------------------------------------