第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的世界。

欢迎大家批评指正,谢谢大家关注!

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

  1. 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter

    上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一.    案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...

  2. Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析

    Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...

  3. Python中的@property装饰器

    要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,n ...

  4. 第9.10节 Python中IO模块其他文件操作属性和方法简介

    本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...

  5. Python使用property函数定义属性访问方法如果不定义fget会怎么样?

    我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...

  6. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  7. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  8. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  9. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

随机推荐

  1. JAVA每日一题20201109

    一.标识符的规则? 1.严格区分大小写,不能使用关键字,保留字,不能重复 2.数字不能开头 二.标识符的命名规范 包名:XXXYYYZZZ 类名,接口名:XxYyZz 变量名,方法名:xxxYyyZz ...

  2. 找出"吸血鬼数"(Java)

    吸血鬼数是指位数为偶数的数字,可以由一 对数字相乘而得到,而这对数字各包含乘积的一半 位数的数字,其中从最初的数字中选取的数字可以任意排序.以两个0结尾的数字是不允许的,例如,下列数字都是 " ...

  3. JVM常用调优工具介绍

    前言 王子在之前的JVM文章中已经大体上把一些原理性问题说清楚了,今天主要是介绍一些实际进行JVM调优工作的工具和命令,不会深入讲解,因为网上资料很多,篇幅可能不长,但都是实用的内容,小伙伴们有不清楚 ...

  4. 无法将“add-migration”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。解决方案

    在程序包管理控制台中执行 Install-Package Microsoft.EntityFrameworkCore.Tools

  5. laravel 控制器中获取不到session

    protected $middleware = [ \Illuminate\Session\Middleware\StartSession::class, ]; 在 kernel.php中 加入Sta ...

  6. k8s event监控利器kube-eventer对接企微告警

    背景 监控是保障系统稳定性的重要组成部分,在Kubernetes开源生态中,资源类的监控工具与组件监控百花齐放. cAdvisor:kubelet内置的cAdvisor,监控容器资源,如容器cpu.内 ...

  7. 测试_appium测试工具

    一.Appium介绍 Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用. 1.Appium 理念 Appium是基于以下的四个理念设计来满足移动平 ...

  8. 理解 ASP.NET Core: 验证

    ASP.NET Core 验证 通常在应用程序中,安全分为前后两个步骤:验证和授权.验证负责检查当前请求者的身份,而授权则根据上一步得到的身份决定当前请求者是否能够访问期望的资源. 既然安全从验证开始 ...

  9. Spring-Boot项目中配置redis注解缓存

    Spring-Boot项目中配置redis注解缓存 在pom中添加redis缓存支持依赖 <dependency> <groupId>org.springframework.b ...

  10. 怎么用MindManager2019去做一个好的网络图

    大家知道网络图吗?是由作业(箭线).事件(又称节点)和路线三个因素组成的.它是一种图解模型,形状如同网络,故称为网络图.运用网络图能够使步骤简洁明了,今天我我们就说一说网络图软件MindManager ...