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 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
在Python编程过程中用单元测试法调试代码的介绍
Apr 02 Python
python制作一个桌面便签软件
Aug 09 Python
Python计算字符宽度的方法
Jun 14 Python
python 获取网页编码方式实现代码
Mar 11 Python
python dataframe常见操作方法:实现取行、列、切片、统计特征值
Jun 09 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
Mar 05 Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 Python
OpenCV3.0+Python3.6实现特定颜色的物体追踪
Jul 23 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
详解向scrapy中的spider传递参数的几种方法(2种)
Sep 28 Python
浏览器常用基本操作之python3+selenium4自动化测试(基础篇3)
May 21 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设计聊天室步步通
2006/10/09 PHP
如何在php中正确的使用json
2013/08/06 PHP
Sublime里直接运行PHP配置方法
2014/11/28 PHP
php显示页码分页类的封装
2017/06/08 PHP
PHP区块查询实现方法分析
2018/05/12 PHP
js 实现打印网页中定义的部分内容的代码
2010/04/01 Javascript
基于jquery的15款幻灯片插件
2011/04/10 Javascript
jWiard 基于JQuery的强大的向导控件介绍
2011/10/28 Javascript
Prototype源码浅析 String部分(四)之补充
2012/01/16 Javascript
利用JS实现数字增长
2016/07/28 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
node获取客户端ip功能简单示例
2019/08/24 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
Python对列表排序的方法实例分析
2015/05/16 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
详解python string类型 bytes类型 bytearray类型
2017/12/16 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
使用pandas对两个dataframe进行join的实例
2018/06/08 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
详解Python requests 超时和重试的方法
2018/12/18 Python
wxpython多线程防假死与线程间传递消息实例详解
2019/12/13 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
家长评语和期望
2014/02/10 职场文书
岗位竞聘书范文
2014/03/31 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
解除劳动合同协议书(样本)
2014/10/02 职场文书
大学生万能检讨书范例
2014/10/04 职场文书
校园运动会广播稿
2015/08/19 职场文书
十个Python自动化常用操作,即拿即用
2021/05/10 Python
浅谈Python数学建模之固定费用问题
2021/06/23 Python