先来看看property类
class property(fget=None, fset=None, fdel=None, doc=None):其中fget是获取属性的值,fset用于设置属性的值,fdel是删除属性,doc是为属性创建文档字符串,官方示例如下:
#定义Person类,使用property类来完成age属性的添加
class Person:
def __init__(self):
self._x=None
def getx(self):
return self._x
def setx(self,value):
self._x=value
def delx(self):
del self._x
age=property(getx,setx,delx,'This is a property test example')
person_a=Person()
person_a.age=56#设置age的值,setx
print(person_a.age)#获取age的值,getx
del person_a.age
如上所示,person_a是Person的实例,此时person_a.age相当于调用getter,而person_a.age=value相当于调用setter,而del person_a.age将调用deleter
实际使用过程中,下面的方式可能更简洁,易读
class Person:
def __init__(self):
self._age=0
@property
def age(self):
return self._age
@age.setter
def age(self,value):
self._age=value
@age.deleter
def age(self):
del self._age
person_b=Person()
person_b.age=56
print(person_b.age)#56
del person_b.age
@property装饰器会将age()方法转化为相同名称只读属性的'getter',进一步@属性.setter和@属性.deleter则设置属性的setter和deleter
这样做的好处在于我们可以随时给类添加属性,而不至于对程序做大的改动
class Person():
def __init__(self,age):
self.age=age
如果我们采用上面这种做法,需要修改程序中的设置函数,删除函数,属性多的时候这样做并不安全,而且在设置时也不方便对age类型进行判断
def setx(self,value):
#在setter中对参数进行判断
if not isinstance(value, int):
raise ValueError('年龄应为整数~')
if value>0:
raise ValueError('年龄应大于0~')
self._x=value
参考资源
@property属性修饰器