Python3 property() 函数详解 设置类属性的方法(资源路由)
property()
函数的主要作用是设置类属性的方法,用于指定属性的获取、修改和删除的对应方法,可以增加对属性的限制,例如验证、过滤、二次处理等。也可以将这个函数理解为属性的“资源路由”,任何与这个属性有关的操作,都会被自动分配给对应的方法去处理。这个函数还可以用类的装饰器@property、@x.setter以及@x.deleter来替代(x为属性名)。
它是Python的内置函数,在python文件中直接可以使用。
语法
property(fget=None, fset=None, fdel=None, doc=None)
参数
fget - 指定属性的获取方法
fset - 指定属性的修改方法
fdel - 指定属性的删除方法
doc - 属性的描述文字
返回值
返回property对象
实例
§ 实例1 - 函数的使用方法
#一般的类属性操作,是直接对属性的处理,它无法进行过滤、验证等操作,而这样设置了属性的处理方法,就等于为属性增加了一层前置方法。
#在下例中我们为属性age的获取、修改、删除各增加了一个print()函数,用于说明现在的操作。在实际的业务中可以加入更多的逻辑。
>>> class User:
... def __init__(self):
... self._age = 0
... def getAge(self):
... print('正在获取年龄属性')
... return self._age
... def setAge(self, value):
... print('正在设置年龄属性')
... self._age = value
... def delAge(self):
... print('正在删除年龄属性')
... del self._age
... age = property(getAge, setAge, delAge, "这是设置年龄的property属性")
...
#实例化类
>>> u = User()
#设置属性,调用了类的setAge()方法。
>>> u.age = 18
正在设置年龄属性
#获取属性,调用了类的getAge()方法。
>>> u.age
正在获取年龄属性
18
#删除属性,调用了类的delAge()方法。
>>> del u.age
正在删除年龄属性
#这是展示第4个参数的作用,可以使用help()函数查看属性的说明文档。
>>> help(User.age)
Help on property:
这是设置年龄的property属性
#注意:虽然我们将getAge,setAge,delAge这三个方法设置给了age属性,但是它们同时也属于类本身,实例化后可以直接被调用,换句话说,这三个方法也暴露给了外部,在一些特定的情况下可能会造成一些混乱,这可能不会是严重的问题。例如:代码前部是用属性,后面却直接用方法了,代码的统一性受到了影响,对后期的维护增加了难度,万一方法名改变了咋办。那么如何避免这些可能存在的问题呢? 我们可以使用类的装饰器来做。请看下一个例子。
§ 实例2 - 装饰器的使用方法
>>> class User:
... def __init__(self):
... self._age = 0
... @property
... def age(self):
... '这是设置年龄的property属性'
... print('正在获取年龄属性')
... return self._age
... @age.setter
... def age(self, value):
... print('正在设置年龄属性')
... self._age = value
... @age.deleter
... def age(self):
... print('正在删除年龄属性')
... del self._age
...
>>> u = User()
>>> u.age = 18
正在设置年龄属性
>>> u.age
正在获取年龄属性
18
>>> del u.age
正在删除年龄属性
>>> help(User.age)
Help on property:
这是设置年龄的property属性
#效果与使用property()是一致的,但是它只能通过属性进行操作了。没有暴露在外面的方法了。