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实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
python服务器与android客户端socket通信实例
Nov 12 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
Python 实现选择排序的算法步骤
Apr 22 Python
python用fsolve、leastsq对非线性方程组求解
Dec 15 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
keras实现图像预处理并生成一个generator的案例
Jun 17 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 Python
Python中request的基本使用解决乱码问题
Apr 12 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
逐步提升php框架的性能
2008/01/10 PHP
php开发文档 会员收费1期
2012/08/14 PHP
深入php多态的实现详解
2013/06/09 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
php 生成Tab键或逗号分隔的CSV
2016/09/24 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
限制文本字节数js代码
2007/03/06 Javascript
JS隐藏参数post传值实例
2013/04/18 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
JavaScript实现弹出模态窗体并接受传值的方法
2016/02/12 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
详解Vue 普通对象数据更新与 file 对象数据更新
2017/04/26 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
vue集成百度UEditor富文本编辑器使用教程
2018/09/21 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
Python中map和列表推导效率比较实例分析
2015/06/17 Python
python实现浪漫的烟花秀
2019/01/30 Python
python mysql断开重连的实现方法
2019/07/26 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
商场中秋节广播稿
2014/01/17 职场文书
简历里的自我评价范文
2014/02/24 职场文书
中华美德颂演讲稿
2014/05/20 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
房产公证委托书范本
2014/09/20 职场文书
高三复习计划
2015/01/19 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
一次MySQL启动导致的事故实战记录
2021/09/15 MySQL