property中四个参数:
- fget -- 获取属性值的函数
- fset -- 设置属性值的函数
- fdel -- 删除属性值函数
- doc -- 属性描述信息
演示代码:
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def getarea(self):
print('getarea1')
return self.width * self.height
#合成了一个计算面积的属性
area = property(fget=getarea, doc='获取面积的属性')
def getsize(self):
print('getsize1')
return self.width, self.height
def setsize(self,size):
print('setsize2')
self.width = size[0]
self.height = size[1]
#合成了一个代表大小的属性
size = property(fget=getsize, fset=setsize, doc='代表大小的属性')
r = Rectangle(30, 40) #r是Rectangle的实例化
print(r.area) #访问arer实例变量,实际上就是调用get方法
print(r.size) #访问size实例变量,实际上就是调用get方法
r.size=(5, 6) #实际调用的是set方法
print(r.area) #访问arer实例变量,实际上就是调用get方法,由于上一句代码已经setsize,所以此时的area出来的结果是30而不是之前的1200
在property里面,单独的r.size 将触发 getter
r.size = value 将触发 setter
del r.size 触发 deleter
如果是使用装饰器,则会变成只读属性:
#合成了一个计算面积的属性
area = property(fget=getarea, doc='获取面积的属性')
def getsize(self):
print('getsize1')
return self.width, self.height
def setsize(self,size):
print('setsize2')
self.width = size[0]
self.height = size[1]
#合成了一个代表大小的属性
size = property(fget=getsize, fset=setsize, doc='代表大小的属性')
替换为:
@property
def area(self)
print('getarea1')
return self.width * self.height
#装饰器合成的属性为只读,此时只读属性名与方法名相同
@property
def size(self)
print('getsize2')
return self.width * self.height
@size.setter #装饰出setter方法,也需要注意只读属性名也与方法名相同
def size(self,size):
print('setsize方法')
self.width = size[0]
self.height = size[1]