class Screen(object):
@property
def width(self):
return self.width
@width.setter
def width(self,value):
return self._width is value
@property
def hegiht(self):
return self._hegiht
@hegiht.setter
def hegiht(self,value):
return self._hegiht is value
@property
def resolution(self):
return self._width*self._hegiht
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
错误: s.width = 1024
File "3.py", line 8, in width
return self._width is value
AttributeError: 'Screen' object has no attribute '_width'
去掉_也是报错: s.width = 1024
File "3.py", line 8, in width
return self.width is value
File "3.py", line 5, in width
return self.width
File "3.py", line 5, in width
return self.width
File "3.py", line 5, in width
return self.width
[Previous line repeated 994 more times]
RecursionError: maximum recursion depth exceeded
class Screen(object):
def init(self):
self._width = 0
self.height = 0
@property
def width(self):
return self._width
@width.setter
def width(self,val):
self._width = val
@property
def resolution(self):
return self.width * self.height
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')
这样写就可以了呀!不需要你写的那么复杂
注意点:
1、self._hegiht is value 其中的is 再python中是做变量间的内存地址的比较的,不是值的比较,你可以通过id 函数获取变量内存地址
2、property 装饰器时只是将类的方法封装成了类的属性。
详细可参考:https://www.cnblogs.com/xiaobaiskill/p/9413732.html#7
开始的时候是用的= 但是也是报错 :
return slef._width=value
^
SyntaxError: invalid syntax
我改成is 就不报这个错
看了教程代码 也是这么写 就没有问题
@BlackCatFish: 你改成is 根本就不会有任何结果,只是做了一个比较而已,毛都没用,毫无意义。
你的这个写法明显的语法错误,赋值操作 加 return,,python没有这种语法。。return 返回的是数据。
@BlackCatFish: 你直接的is 之所以没有报错,是因为slef._width is value 这是一个boolean 类型 的数据,是可以返回的。is 比较的是 变量的内存地址,== 比较的是数据的值。
@xiaobaiskill: 谢了 领教了