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根据时间生成mongodb的ObjectId的方法
Mar 13 Python
总结Python编程中函数的使用要点
Mar 20 Python
Python进阶-函数默认参数(详解)
May 18 Python
实例讲解python中的序列化知识点
Oct 08 Python
解决python opencv无法显示图片的问题
Oct 28 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
django 捕获异常和日志系统过程详解
Jul 18 Python
pytorch 指定gpu训练与多gpu并行训练示例
Dec 31 Python
详解numpy.ndarray.reshape()函数的参数问题
Oct 13 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
python中openpyxl和xlsxwriter对Excel的操作方法
Mar 01 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简单提示框alert封装函数
2010/08/08 PHP
求PHP数组最大值,最小值的代码
2011/10/31 PHP
基于PHP对XML的操作详解
2013/06/07 PHP
ThinkPHP实现二级循环读取的方法
2014/11/03 PHP
PHP中使用imagick实现把PDF转成图片
2015/01/26 PHP
php自定义urlencode,urldecode函数实例
2015/03/24 PHP
php实现源代码加密的方法
2015/07/11 PHP
php邮件发送的两种方式
2020/04/28 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
Jquery时间验证和转换工具小例子
2013/07/01 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
BootstrapValidator超详细教程(推荐)
2016/12/07 Javascript
详解KOA2如何手写中间件(装饰器模式)
2018/10/11 Javascript
layui use 定义js外部引用函数的方法
2019/09/26 Javascript
JavaScript实现图片放大预览效果
2020/11/02 Javascript
vue 通过base64实现图片下载功能
2020/12/19 Vue.js
Python实现调用另一个路径下py文件中的函数方法总结
2018/06/07 Python
python保存网页图片到本地的方法
2018/07/24 Python
python之消除前缀重命名的方法
2018/10/21 Python
Python 串口读写的实现方法
2019/06/12 Python
Series和DataFrame使用简单入门
2019/11/13 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
keras之权重初始化方式
2020/05/21 Python
纯CSS3实现圆角效果(含IE兼容解决方法)
2014/05/07 HTML / CSS
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
开会迟到检讨书
2014/02/03 职场文书
行政监察建议书
2014/05/19 职场文书
教师职位说明书
2014/07/29 职场文书
2014年双拥工作总结
2014/11/21 职场文书
《角的度量》教学反思
2016/02/18 职场文书