第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解程序员
1、 引言
Python中的装饰器在前面接触过,老猿尚未深刻展开介绍装饰器相关的内容,在后面将单独的章节来介绍。Python总共包括三个内置装饰器(注意abstractmethod这个装饰器是从abc模块导入的,不是内置的),除了前面介绍的类方法装饰器classmethod、静态方法装饰器staticmethod外,还有一个property装饰器,这个装饰器与property函数的目的是同样,只是使用方法上有所不一样。函数
2、 装饰器property的语法释义
Python中的property装饰器与property函数同样,是将对属性的访问转换为对应的方法,所以与property函数,装饰器也提供了属性的get、set、del方法。其相关定义都是在类内定义方法的语句前使用,具体语法以下:
一、 get装饰器:
@property
def 属性名(self):
方法代码
return 属性返回值学习
语法释义:
1) get装饰器用于访问属性名时执行相关的代码,必须是@property这个内置装饰器来定义,全部的装饰器属性的get方法都必须是使用这个内置装饰器。也就是说被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用作 属性名;
2) 此处的属性名与property返回的实例属性是一个概念,其余地方使用该属性名进行访问,该属性名在后面定义set方法和del方法时都必须是该名字;
3) 属性返回值能够是一个通过方法代码处理过的值,能够是某个实例变量或实例变量运算后的值,若是直接返回某个实例变量,则方法代码能够没有。.net
二、 set装饰器:
@属性名.setter
def 属性名(self,value):
方法代码blog
设置某个实例变量来保存value或value通过运算的值
语法释义:
1) 本部分的装饰器是@属性名.setter,属性名是前面@property 定义get方法时指定的属性名,必须一致。“setter”用于指定该装饰器是set装饰器,固定用“setter”。被 @属性名.setter 装饰的方法是设置属性值的方法;
2) 注意def的函数名的名字必须与属性名一致,在此种状况下,定义属性的get、set、del的函数名都是属性名,这个与前面介绍的Python不支持函数的重载看起来是矛盾的,但实际上因为装饰器自己也是个函数,装饰器后面的函数被装饰器自己这个函数嵌套,所以其做用域仅限于装饰器函数内,所以重名并不存在覆盖的状况;
3) value是属性要设置的值,若是属性是通过运算得出,赋值也须要反向倒推,若是函数直接将value保存到实例变量,则方法代码中只需一个赋值语句就能够。作用域
三、 del装饰器:
@属性名.deleter
def 属性名(self):
方法代码get
1) 被 @属性名.deleter 装饰的方法是删除属性值的方法,属性名一样必须是前面get方法定义的属性名,“deleter ”是固定不变的,其做用就是在外部调用“del 属性名”时方法当作删除操做执行。
2) 注意def的函数名的名字必须与属性名一致。
注意:
1. 经过@property定义一个属性时,get装饰器是必须定义的,set和del装饰器看是否须要再确认是否认义,若是没有定义setter,该属性就不能赋值,若是没有定义deleter,则该属性不能删除。
2. 装饰器定义的属性名和类实例变量名不要相同,其缘由与前面章节介绍property函数定义属性的缘由是同样的。具体请参考本博客的《第7.26节 Python案例详解:使用property函数定义与实例变量同名的属性会怎样?》博客
本节详细的介绍了property装饰器的使用语法,注意经过property装饰器定义属性时必须至少定义一个getter装饰器用于读取属性的值。老猿认为,实际上property装饰器与property函数本质上是一致的,只是定义的语法有所不一样。下节将结合一个案例对上述知识点进行进一步的介绍。
老猿Python(https://blog.csdn.net/LaoYuanPython)系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员能够很容易地进入Python的世界。
欢迎你们批评指正,谢谢你们关注!class