第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保存到实例变量,则方法代码中只需一个赋值语句就可以。
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 详解的更多相关文章
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- Python中的@property装饰器
要了解@property的用途,首先要了解如何创建一个属性. 一般而言,属性都通过__init__方法创建,比如: class Student(object): def __init__(self,n ...
- 第9.10节 Python中IO模块其他文件操作属性和方法简介
本文中所有案例中的fp都是使用open函数打开文件返回的一个文件对象,为了节省篇幅,大部分没有提供文件打开的代码. 一. 文件是否关闭的属性 属性名:closed 功用:判断文件是否关闭 示例: &g ...
- Python使用property函数定义属性访问方法如果不定义fget会怎么样?
我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
- 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析
一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
随机推荐
- PS零基础入门教程--裁剪工具用法
我是IT轩,分享一下我使用PS的一些用法,希望对大家有帮助!欢迎关注微信公众号:笑林新记 PS版本:PS CC 2019 主要技术:裁剪工具. 裁剪工具主要有:裁剪工具.透视裁剪工具.切片工具和切片选 ...
- leetcode6:binary-tree-postorder-traversal
题目描述 求给定的二叉树的后序遍历. 例如: 给定的二叉树为{1,#,2,3}, 1↵ ↵ 2↵ /↵ 3↵ 返回[3,2,1]. 备注:用递归来解这道题太没有新意了,可以给出迭代的解法么? Give ...
- 手撸ORM浅谈ORM框架之Query篇
快速传送 手撸ORM浅谈ORM框架之基础篇 手撸ORM浅谈ORM框架之Add篇 手撸ORM浅谈ORM框架之Update篇 手撸ORM浅谈ORM框架之Delete篇 手撸ORM浅谈ORM框架之Query ...
- Javascript 参数传递
又一个基本概念出问题,参数传递都是值传递, var a={x:10} function test(obj){obj=1} test(a) console.log(a) 输出什么,如果你说1,那就错了, ...
- Fiddler的一系列学习瞎记3
Http: 不安全.可以很容易被拦截,或者其他的嗅探工具发现.怎么样做到安全?起码一下两点: 1.浏览器和we服务器之间的内容应该只有浏览器和web服务器能看到通信内容. 2.Http请求和Http的 ...
- 深入理解h2和r2dbc-h2
简介 本文将会介绍R2DBC的H2实现r2dbc-h2的使用方法和要注意的事项.一起来看看吧. H2数据库简介 什么是H2数据库呢? H2是一个Java SQL database,它是一个开源的数据库 ...
- kettle连接报错
如何查看端口号 cmd命令行 输入mysql -u root -p密码进入mysql 输入show global variables like 'port'; 就可以看到端口号3306 测试数据库链接 ...
- shell脚本快速入门----正则表达式
一. "." 符号 (一个英文句号) 用于匹配换行符之外的任意一个字符 如 root 可用r..t来匹配 二. "*"符号 重复匹配前一个字符 如ab abc ...
- Frogs‘ Neighborhood(POJ 1659 C/C++)
poj 1659 Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路 ...
- C++ const的自我理解
C++学习笔记–const const 是 constant 的缩写,本意是不变的,不易改变的意思.在 C++ 中是用来修饰内置类型变量,自定义对象,成员函数,返回值,函数参数. C++ const ...