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 相关文章推荐
Python3使用requests包抓取并保存网页源码的方法
Mar 15 Python
Python实现霍夫圆和椭圆变换代码详解
Jan 12 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
python简单操作excle的方法
Sep 12 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
python初步实现word2vec操作
Jun 09 Python
python脚本和网页有何区别
Jul 02 Python
基于python tkinter的点名小程序功能的实例代码
Aug 22 Python
详解python对象之间的交互
Sep 29 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
BBS(php & mysql)完整版(八)
2006/10/09 PHP
解决php中Cannot send session cache limiter 的问题的方法
2007/04/27 PHP
鸡肋的PHP单例模式应用详解
2013/06/03 PHP
php读取csv文件并输出的方法
2015/03/14 PHP
PHP如何实现Unicode和Utf-8编码相互转换
2015/07/29 PHP
thinkPHP数据查询常用方法总结【select,find,getField,query】
2017/03/15 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
checkbox 复选框不能为空
2009/07/11 Javascript
JavaScript之自定义类型
2012/05/04 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
JavaScript把数组作为堆栈使用的方法
2015/03/20 Javascript
jquery实现美观的导航菜单鼠标提示特效代码
2015/09/06 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
mongoose中利用populate处理嵌套的方法
2017/05/26 Javascript
使用jQuery实现简单的tab框实例
2017/08/22 jQuery
JS实现不用中间变量temp 实现两个变量值得交换方法
2018/02/04 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
Vue组件之高德地图地址选择功能的实例代码
2019/06/21 Javascript
JavaScript 正则应用详解【模式、欲查、反向引用等】
2020/05/13 Javascript
[02:51]DOTA2英雄基础教程 风暴之灵
2013/12/23 DOTA
[02:41]辉夜杯现场一家三口 “我爸玩风行 我玩血魔”
2015/12/27 DOTA
Python实现二分查找与bisect模块详解
2017/01/13 Python
详解Python传入参数的几种方法
2019/05/16 Python
关于tensorflow的几种参数初始化方法小结
2020/01/04 Python
Python中itertools的用法详解
2020/02/07 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
python 提高开发效率的5个小技巧
2020/10/19 Python
关于python中导入文件到list的问题
2020/10/31 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
Theflamel意大利:女士奢华服装、鞋子和配件
2020/01/11 全球购物
大学生毕业的自我评价分享
2014/01/02 职场文书
护士毕业自我鉴定
2014/02/07 职场文书
创业者是否需要商业计划书?
2014/02/07 职场文书
年终晚会主持词
2014/03/25 职场文书