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

本文详细介绍了Python中的@property装饰器,它与property函数目的相同,可将属性访问转换为对应方法。文中阐述了get、set、del三种装饰器的语法及释义,强调get装饰器必须定义,set和del按需定义,还提醒属性名和实例变量名不要相同。
部署运行你感兴趣的模型镜像

第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保存到实例变量,则方法代码中只需一个赋值语句就可以。

3、    del装饰器:
@属性名.deleter
def 属性名(self):
     方法代码

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的世界。
欢迎大家批评指正,谢谢大家关注!

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

Python 的 `@property` 装饰器是内置的属性管理装饰器,它将类方法转换为类属性访问接口,是 `property()` 内置函数的应用形式之一,与 `@staticmethod`、`@classmethod` 同属 Python 内置的函数装饰器 [^1][^3]。 ### 主要作用 - **创建只读属性**:通过 `@property` 装饰器修饰方法,可将方法转换为只读属性,像访问普通属性一样访问方法,且不能对其进行赋值操作。例如: ```python class Human(object): def __init__(self, value): self._age = value @property def age(self): return self._age if __name__ == '__main__': peter = Human(18) print("the age of peter is {}".format(peter.age)) # peter.age = 20 # 如果要修改属性将会报错 ``` 在这个例子中,`age` 方法被 `@property` 装饰后,可像属性一样访问 `peter.age`,但尝试修改 `peter.age` 会报错 [^2]。 ### 运行机制 - **Getter 方法**:使用 `@property` 装饰的方法作为 Getter 方法,用于获取属性的值。例如: ```python class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius ``` 这里的 `radius` 方法就是 Getter 方法,可通过 `circle.radius` 来获取圆的半径 [^3]。 - **Setter 方法**:使用 `@属性.setter` 装饰的方法作为 Setter 方法,用于设置属性的值。例如: ```python class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @radius.setter def radius(self, value): if value < 0: raise ValueError("半径不能为负数") self._radius = value ``` 在这个例子中,`@radius.setter` 装饰的 `radius` 方法就是 Setter 方法,当对 `circle.radius` 进行赋值操作时,会调用该方法进行赋值,同时会进行输入验证,确保半径不为负数 [^3]。 - **Deleter 方法**:使用 `@属性.deleter` 装饰的方法用于定义删除属性的行为。例如: ```python class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): return self._radius @radius.setter def radius(self, value): if value < 0: raise ValueError("半径不能为负数") self._radius = value @radius.deleter def radius(self): del self._radius ``` 当执行 `del circle.radius` 时,会调用 `@radius.deleter` 装饰的方法删除半径属性 [^3]。 ### 核心价值 - **封装性**:隐藏属性操作的具体实现,外部只能通过定义好的接口来访问和修改属性,提高了代码的安全性和可维护性。 - **可维护性**:在不改变外部接口的前提下修改内部逻辑,例如在 Setter 方法中添加验证逻辑,不会影响外部代码对属性访问方式。 - **安全性**:通过验证机制保护数据完整性,如在 Setter 方法中对输入值进行验证,确保数据符合要求 [^3]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LaoYuanPython

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值