property 装饰器是把方法变成属性调用的
from math import pi
class Circle:
def __init__(self,r):
self.r = r
@property#把这个方法伪装成可读属性
def perimeter(self):#property伪装成为属性不能传入任何参数
return 2*pi*self.r
@property#把这个方法伪装成可读属性
def area(self):#property伪装成为属性不能传入任何参数
return self.r**2*pi
c1 = Circle(5)
print(c1.area) # 圆的面积
print(c1.perimeter) # 圆的周长
# 查看 修改 删除
class Person:
def __init__(self,name):
self.__name = name
self.price = 20
@property#查看(可读属性)
def name(self):
return self.__name
@name.deleter #删除
def name(self):
del self.__name
@name.setter #修改(可写属性)
def name(self,new_name):
self.__name = new_name
brother2 = Person('二哥')
del Person.price
brother2.name = 'newName'
brother2
del brother2.name#自动触发@name.deleter方法
print(brother2.name)
练习题
请利用@property给一个Screen对象加上width和height属性,以及一个只读属性resolution
#width属性可读可写
#height属性可读可写
#resolution属性可读
class Screen(object):
@property#查看width
def width(self):
return self._width#注意短划线
@width.setter#设置width
def width(self, value):
self._width= value#注意短划线
@property#查看height
def height(self):
return self._height#注意短划线
@height.setter#设置height
def height(self, value):
self._height= value#注意短划线
@property
def resolution(self):
return self._height * self._width
# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
print('测试通过!')
else:
print('测试失败!')