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之dict()的操作方法
Sep 24 Python
基于python实现的抓取腾讯视频所有电影的爬虫
Apr 22 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
Django框架创建mysql连接与使用示例
Jul 29 Python
python使用html2text库实现从HTML转markdown的方法详解
Feb 21 Python
Django REST Swagger实现指定api参数
Jul 07 Python
经验丰富程序员才知道的8种高级Python技巧
Jul 27 Python
python实现二分查找算法
Sep 18 Python
python爬虫筛选工作实例讲解
Nov 23 Python
python实现控制台输出颜色
Mar 02 Python
教你使用pyinstaller打包Python教程
May 27 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验证复选框有效性的示例
2013/11/13 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
IE浏览器兼容Firefox的JS脚本的代码
2008/10/23 Javascript
jquery 获取json数据实现代码
2009/04/27 Javascript
JS分页效果示例
2013/10/11 Javascript
JS实现方向键切换输入框焦点的方法
2015/08/19 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
JavaScript 对象深入学习总结(经典)
2015/09/29 Javascript
jQuery层级选择器_动力节点节点Java学院整理
2017/07/04 jQuery
JavaScript实现简单的双色球(实例讲解)
2017/07/31 Javascript
JS删除String里某个字符的方法
2021/01/06 Javascript
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
微信小程序自定义胶囊样式
2020/12/27 Javascript
jquery实现广告上下滚动效果
2021/03/04 jQuery
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
基于Python实现的扫雷游戏实例代码
2014/08/01 Python
python基于multiprocessing的多进程创建方法
2015/06/04 Python
Python脚本实现Web漏洞扫描工具
2016/10/25 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
2017/08/31 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python中一般处理中文的几种方法
2019/03/06 Python
Python 脚本的三种执行方式小结
2019/12/21 Python
mac在matplotlib中显示中文的操作方法
2020/03/06 Python
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
承办会议欢迎词
2014/01/17 职场文书
市场营销方案范文
2014/03/11 职场文书
医学生求职信
2014/07/01 职场文书
父亲节寄语大全
2015/02/27 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
总结Python常用的魔法方法
2021/05/25 Python
教你怎么用python selenium实现自动化测试
2021/05/27 Python
python如何利用cv2模块读取显示保存图片
2021/06/04 Python