每天Python学习--关于property的用法

先来看看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属性修饰器

你可能感兴趣的:(每天Python学习--关于property的用法)