property用法解析
Python 语言中property能够控制对对象属性的访问(设置/获取/修改/删除值)。比如对象如果有年龄(age)和工资(salary)属性,那么如果对这两个属性设置(或者修改)为小于0的值,就会造成逻辑上的错误。虽然可以要求录入员在录入信息时确保属性值大于0,但是依旧会存在错误录入的可能性。
为了确保录入工资值大于0,利用property,我们可以在设置值的过程上动点手脚。有两种方式动手脚的方式
property 函数
property装饰器
01
property(fget, fset, fdel, doc)
在其他语言中,为了对age属性进行访问控制,在类中通过set_age/modify_age/delete_age等方法分别对值进行设置/修改/删除(在设置、修改函数里面可以对值合理性进行判断)。Python当然也可以。在类里面写上与属性访问有关的几个函数
get_value(self)
set_value(self,newvalue)
del_value
现在就可以通过set_value/get_value来对值进行修改。但是使用的时候需要记住三个函数名字,不够Pythonic。因此,Python提供了property函数将它们组合起来
value=property(get_value,set_value,del_value, )
现在value的值 设置/获取/删除 可以按照常规属性那样进行,程序内部会分别调用 set/get/del_value 方法。再通过在各自的函数里面添加处理逻辑就可以完成想对属性的参数检查操作:比如前面涉及的 拒绝写入小于0的年龄属性。
这种方式需要在类中先定义处理方法,然后通过property函数把它们组装起来。另一种方法是通过property装饰器,抹去组装这一步。
02
@property
另外一种不直接调用property函数的方法是使用property装饰器(decorator)。装饰器是一种元编程的方式,元编程简短而言就是针对已有的代码进行编程,比如把函数包装一下,输出它的调用时间:函数本身代码没有变化,而是在它的基础上添加了打印输出时间的功能。property装饰器的用法如下
@property
defvalue(self)
@value.setter
defvalue(self,new_value)
@value.deleter
defvalue(self)
用@property装饰器装饰三个同名函数,这三个函数分别对应于获取/设置/删除属性,再把必要的逻辑可以添加在相应的函数里面。
以前面的salary属性为例,为了确保salary值不会小于0,在@salary.setter红色代码处判断了工资。
通过@property装饰器对salary的值进行了判断,代码现在是绝对不会把salary值设为负数了,bingo。
Wait a moment, 似乎不会对初始化传进来的工资值进行判断?!!
是的,我本应该去搭讪
领取专属 10元无门槛券
私享最新 技术干货