天天看点

第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

一、    引言

Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰器相关的内容,在后面将单独的章节来介绍。Python总共包括三个内置装饰器(注意abstractmethod这个装饰器是从abc模块导入的,不是内置的),除了前面介绍的类方法装饰器classmethod、静态方法装饰器staticmethod外,还有一个property装饰器,这个装饰器与property函数的目的是一样,只是使用方法上有所不同。

二、    装饰器property的语法释义

Python中的property装饰器与property函数一样,是将对属性的访问转换为对应的方法,因此与property函数,装饰器也提供了属性的get、set、del方法。其相关定义都是在类内定义方法的语句前使用,具体语法如下:

1、    get装饰器:

@property

def 属性名(self):

    方法代码

return 属性返回值

        语法释义:

1)    get装饰器用于访问属性名时执行相关的代码,必须是@property这个内置装饰器来定义,所有的装饰器属性的get方法都必须是使用这个内置装饰器。也就是说被 @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名;

2)    此处的属性名与property返回的实例属性是一个概念,其他地方使用该属性名进行访问,该属性名在后面定义set方法和del方法时都必须是该名字;

3)    属性返回值可以是一个经过方法代码处理过的值,可以是某个实例变量或实例变量运算后的值,如果直接返回某个实例变量,则方法代码可以没有。

2、    set装饰器:

@属性名.setter

def 属性名(self,value):

     方法代码

     设置某个实例变量来保存value或value经过运算的值

语法释义:

1)    本部分的装饰器是@属性名.setter,属性名是前面@property 定义get方法时指定的属性名,必须一致。“setter”用于指定该装饰器是set装饰器,固定用“setter”。被 @属性名.setter 装饰的方法是设置属性值的方法;

2)    注意def的函数名的名字必须与属性名一致,在此种情况下,定义属性的get、set、del的函数名都是属性名,这个与前面介绍的Python不支持函数的重载看起来是矛盾的,但实际上由于装饰器本身也是个函数,装饰器后面的函数被装饰器本身这个函数嵌套,因此其作用域仅限于装饰器函数内,因此重名并不存在覆盖的情况;

3)    value是属性要设置的值,如果属性是经过运算得出,赋值也需要反向倒推,如果函数直接将value保存到实例变量,则方法代码中只需一个赋值语句就可以。