Python装饰器之property()详解
1. 何为装饰器?
官方定义:装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
Python中总共包括三个内置装饰器:
① staticmethod
② classmethod
③ property
2. 属性函数 property() 浅谈
2.1 为什么要使用 property?
通常,我们在访问属性和给属性赋值的时候,都是对 类和实例 __dict__ 打交道的;但如果我们想要规范属性访问,有两种方式可用:①数据描述符 ,②. property() 属性函数。
然而,我们知道,描述符相对比较复杂,对于新手来说,用起来很吃力,那么不妨试试property(),相对于描述符这个大的进程,property就相当于线程。
2.2 函数原型:
property(fget=None, fset=None, fdel=None, doc=None)
2.3 普通方法定义:
假设 calss Normal中有一个私有变量 __x,如下代码所示:
#code 1
class Normal:def __init__(self):self.__x = Nonedef getx(self):return self.__xdef setx(self, value):self.__x = valuedef delx(self):del self.__x
tN = Normal()
print(tN.__count)
输出结果(报错了)
Traceback (most recent call last):File "C:/Users/Administrator/AppData/Local/Programs/Python/Python35/property.py", line 15, in <module>print(tN.__count)
AttributeError: 'Normal' object has no attribute '__count'
为啥报错了呢?因为 实例tN的属性 __x 为私有属性,不能直接访问,为此我们只能调用内部定义的 方法;
tN = Normal()
tN.setx(10)
print(tN.getx())
输出结果:
6 10
使用内部的方法,可以容易的得到实例的或者类的私有属性值;
然而,如果我想把 class Normal 的 setx方法名改成了其它(如 Normal_setx),外部很多地方用到了该函数,是不是我需要一个一个的去找该方法的调用地点,然后一个一个的改呢?
c语言或许会,但Python,一个高级语言,怎么会这么点事都解决不了呢?
那么,该如何解决以上问题呢?
其实有两种方法。
方法一:使用 属性函数property()
class Normal:def __init__(self):self.__x = Nonedef getx(self):print('getx(): self.__x=', self.__x)return self.__xdef setx(self, value):self.__x = valueprint('setx()')def delx(self):print('delx()')del self.__xy = property(getx, setx, delx, "I'm a property")
tN=Normal()
tN.y=10
tN.y
del tN.y
#输出结果:
setx()
getx(): self.__x= 10
delx()
直接把方法当属性来操作了,非常方便
方法二:使用 @property 装饰器
class Normal:def __init__(self):self.__x = None@propertydef xx(self):print('getx(): self.__x=', self.__x)return self.__x@xx.setterdef xx(self, value):self.__x = valueprint('setx()')@xx.deleterdef xx(self):print('delx()')del self.__x
tN=Normal()
tN.xx=10
tN.xx
del tN.xx
#输出结果信息:
setx()
getx(): self.__x= 10
delx()
跟方法一 输出同样的结果,证明,这两种方法都可行的(注意:第一个一定是 @property(替代getter哦,不然会报错))。
Python装饰器之property()详解相关推荐
- python装饰器详解-Python装饰器基础详解
装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法或者类进行加工.在Python中,我们有多种方法对函数和类进行加工,比如在Python闭包中,我们见到函数对象作为某一 ...
- python装饰器(详解)
大家好,我是J哥. 今天我们介绍一下python中的装饰器 首先我们要了解什么是装饰器 1.什么是装饰器 器指的是工具,可以定义成成函数 装饰指的是为其他事物添加额外的东西点缀 合到一起的解释:装饰器 ...
- python利器怎么编程-Python任务调度利器之APScheduler详解
任务调度应用场景 所谓的任务调度是指安排任务的执行计划,即何时执行,怎么执行等.在现实项目中经常出现它们的身影:特别是数据类项目,比如实时统计每5分钟网站的访问量,就需要每5分钟定时从日志数据分析访问 ...
- Python内置函数详解——总结篇
引 言 国庆期间下定决心打算学习Python,于是下载安装了开发环境.然后问题就来了,怎么开始呢?纠结一番,还是从官方帮助文档开始吧.可是全是英文啊,英语渣怎么破?那就边翻译边看边实践着做吧(顺便 ...
- Python 中 with 用法详解
浅谈 Python 的 with 语句:https://developer.ibm.com/zh/articles/os-cn-pythonwith/ python3,浅谈with的神奇魔法:http ...
- python字符串连接操作-Python连接字符串过程详解
这篇文章主要介绍了python连接字符串过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在python中,如果有多个字符串,想要连接在一起, ...
- python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...
- Python Turtle 海龟绘图详解官方文档中文版
Python Turtle 海龟绘图详解 (官方文档中文版)-安徽省太湖中学陈晓中整理 概述 海龟绘图很适合用来引导孩子学习编程. 最初来自于 Wally Feurzeig, Seymour Pape ...
- python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解
本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...
最新文章
- 提高开发效率之VS Code基础配置篇
- 【自动驾驶】17. pitch yaw roll是什么
- c++工程师面试常见问题之c++中四种cast转换
- boost的chrono模块最小时间点的测试程序
- Dapr牵手.NET学习笔记:Actor小试
- python列表的排序方法_Python 列表 sort() 方法
- 学计算机高考分数线,2020高考分数线预测
- 从Hadoop看普通算法在一个系统中的应用
- 2021 浏览器edge改 ie11 模式
- 为什么电脑浏览器打不开网页但微信可以登陆
- 抢购倒计时自定义控件的实现与优化
- 计算机读取数据的接囗教程,八爪鱼采集怎样获取数据API链接 八爪鱼采集获取数据API链接的方法...
- 思科新版ccnp中教你如何EIGRP协议DUAL弥散更新算法简述
- gcore 获取程序core dump file 但程序不用退出,gdb 分析core
- udp丢包 又是udp丢包
- 【Unity3D实现自定义调色板】
- 如何屏蔽电脑弹出的广告
- 梅科尔工作室—罗森——鸿蒙笔记3
- iOS 手势的使用 六个手势 轻拍 长按 拖拽 捏合 轻扫 旋转
- 硬件描述语言与c语言函数,计算机硬件描述语言(VHDL)与编程语言(C语言)的区别及关系,...
热门文章
- MySQL dump文件导入
- [Laravel框架学习一]:Laravel框架的安装以及 Composer的安装
- SQL 获取数据IP,ServerName,ClientIPAddress
- java:蓝桥杯 矩阵乘法
- python测试需要学什么_从手工测试到自动化测试需要学什么?
- aspx网页背景图片设置代码_python requests,BeautifulSoup批量下载360图片
- 计算机用户名密码策略,设置域用户帐户密码策略
- git clone 失败
- 20169214 2016-2017-2 《网络攻防实践》实验二学习总结
- MVC强类型和弱类型的区别