python3 property装饰器实现原理与用法示例


Posted in Python onMay 15, 2019

本文实例讲述了python3 property装饰器实现原理与用法。分享给大家供大家参考,具体如下:

学习python的同学,慢慢的都会接触到装饰器,装饰器在python里是功能强大的语法。装饰器配合python的魔法方法,能实现很多意想不到的功能。废话不多说,如果你已经掌握了闭包的原理,代码的逻辑还是可以看明白的,咱们直接进入正题。

property的意义

@property把一个类的getter方法变成属性,如果还有setter方法,就在setter方法前面加上@method.setter。使用类属性=property(getx,setx,delx,desc)也是可以的。

实现很简单,那么它背后的原理是什么呢?

Property类的伪代码如下,里面涉及了__get__、__set__、__delete__魔法方法。Decorator类是装饰器类,Target是目标类。当你设置装饰器类的实例对象为目标类的x属性后,当试图访问目标类的x属性会触发装饰器类的__get__方法;当为目标类的x属性赋值时,会触发装饰器类的__setter__方法;尝试删除目标类的x属性时,会触发装饰器类的__delete__方法。当访问Target.x.__doc__,可以打印出装饰器类的描述文档。事实上这种装饰器类也被称为描述符类。描述符类就是将一个特殊类的实例指派给一个类的属性。

类属性实现方式:

class Decorator(object):
  def __init__(self, fget=None, fset=None, fdel=None, doc=None):
    self.fget = fget
    self.fset = fset
    self.fdel = fdel
    self.__doc__ = doc
  def __get__(self, instance, owner):
    if instance is None:
      return self
    return self.fget(instance)
  def __set__(self, instance, value):
    self.fset(instance, value)
  def __delete__(self, instance):
    self.fdel(instance)
  def getter(self, fget):
    return Decorator(fget, self.fset, self.fdel, self.__doc__)
  def setter(self, fset):
    return Decorator(self.fget, fset, self.fdel, self.__doc__)
  def deleter(self, fdel):
    return Decorator(self.fget, self.fset, fdel, self.__doc__)
class Target(object):
  desc = "Amazing pyhton"
  def __init__(self, attr=5):
    self._x = attr
  def getx(self):
    return self._x
  def setx(self, value):
    self._x = value
  def delx(self):
    del self._x
  x = Decorator(getx,setx,delx,desc)

装饰器实现方式:

class Decorator(object):
  def __init__(self, fget=None, fset=None, fdel=None, doc=None):
    self.fget = fget
    self.fset = fset
    self.fdel = fdel
    self.__doc__ = doc
  def __get__(self, instance, owner):
    if instance is None:
      return self
    return self.fget(instance)
  def __set__(self, instance, value):
    self.fset(instance, value)
  def __delete__(self, instance):
    self.fdel(instance)
  def getter(self, fget):
    return Decorator(fget, self.fset, self.fdel, self.__doc__)
  def setter(self, fset):
    return Decorator(self.fget, fset, self.fdel, self.__doc__)
  def deleter(self, fdel):
    return Decorator(self.fget, self.fset, fdel, self.__doc__)
class Target(object):
  desc = "Amazing pyhton"
  def __init__(self, attr=5):
    self._x = attr
  @Decorator
  def show(self):
    return self._x
  @show.setter
  def show(self, value):
    self._x = value
  @show.deleter
  def show(self):
    del self._x

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
Python Queue模块详解
Nov 30 Python
python批量替换页眉页脚实例代码
Jan 22 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
Jun 26 Python
Python:Numpy 求平均向量的实例
Jun 29 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
Python爬取新型冠状病毒“谣言”新闻进行数据分析
Feb 16 Python
学python需要去培训机构吗
Jul 01 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
Python虚拟环境virtualenv创建及使用过程图解
Dec 08 Python
详解Python下载图片并保存本地的两种方式
May 15 #Python
Python常用模块之requests模块用法分析
May 15 #Python
Django框架实现的普通登录案例【使用POST方法】
May 15 #Python
Django框架使用mysql视图操作示例
May 15 #Python
scrapy-redis源码分析之发送POST请求详解
May 15 #Python
windows系统中Python多版本与jupyter notebook使用虚拟环境的过程
May 15 #Python
使用Python做定时任务及时了解互联网动态
May 15 #Python
You might like
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
Yii2框架BootStrap样式的深入理解
2016/11/07 PHP
php的扩展写法总结
2019/05/14 PHP
Javascript学习笔记 delete运算符
2011/09/13 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
jquery ajax局部加载方法详解(实现代码)
2016/05/12 Javascript
Vue.js快速入门教程
2016/09/07 Javascript
vue+express 构建后台管理系统的示例代码
2018/07/19 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
js中事件对象和事件委托的介绍
2019/01/21 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
Vue v-for中的 input 或 select的值发生改变时触发事件操作
2020/08/31 Javascript
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
Python字符串中添加、插入特定字符的方法
2019/09/10 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
2020/04/02 Python
Python unittest框架操作实例解析
2020/04/13 Python
Pandas中两个dataframe的交集和差集的示例代码
2020/12/13 Python
一个入门级python爬虫教程详解
2021/01/27 Python
夏威夷航空官网:Hawaiian Airlines
2016/09/11 全球购物
数组越界问题
2015/10/21 面试题
营销与策划应届生求职信
2013/11/04 职场文书
素质拓展感言
2014/01/29 职场文书
给客户的感谢信
2015/01/21 职场文书
高中教师个人总结
2015/02/10 职场文书
毕业论文答辩开场白和答辩技巧
2015/05/27 职场文书
保护地球的宣传语
2015/07/13 职场文书
Java设计模式之代理模式
2022/04/22 Java/Android
CSS link与@import的区别和用法解析
2023/05/07 HTML / CSS