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 正则表达式 概述及常用字符
May 04 Python
python实现博客文章爬虫示例
Feb 26 Python
Python采集腾讯新闻实例
Jul 10 Python
Python中使用haystack实现django全文检索搜索引擎功能
Aug 26 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
Django框架使用内置方法实现登录功能详解
Jun 12 Python
python使用装饰器作日志处理的方法
Jul 11 Python
详解使用Python下载文件的几种方法
Oct 13 Python
如何基于python操作json文件获取内容
Dec 24 Python
tensorflow指定CPU与GPU运算的方法实现
Apr 21 Python
无惧面试,带你搞懂python 装饰器
Aug 17 Python
浅谈pytorch中的dropout的概率p
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中全面阻止SQL注入式攻击分析小结
2012/01/30 PHP
2014过年倒计时示例
2014/01/31 PHP
PHP CURL获取返回值的方法
2014/05/04 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
ThinkPHP处理Ajax返回的方法
2014/11/22 PHP
浅谈php处理后端&接口访问超时的解决方法
2016/10/29 PHP
通过PHP设置BugFree获取邮箱通知
2019/04/25 PHP
看了就知道什么是JSON
2007/12/09 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
jquery属性过滤选择器使用示例
2013/06/18 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jQuery 常用代码集锦(必看篇)
2016/05/16 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
bootstrap flask登录页面编写实例
2016/11/01 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
javascript数组定义的几种方法
2017/10/06 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
浅谈layui里的上传控件问题
2019/09/26 Javascript
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
11个并不被常用但对开发非常有帮助的Python库
2015/03/31 Python
在Python中处理XML的教程
2015/04/29 Python
Python脚本实现自动发带图的微博
2016/04/27 Python
详谈python在windows中的文件路径问题
2018/04/28 Python
Python3中的json模块使用详解
2018/05/05 Python
Java中实现多态的机制是什么?
2014/12/07 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
活动总结格式范文
2014/04/26 职场文书
初中英语演讲稿
2014/04/29 职场文书
厉行勤俭节约倡议书
2014/05/16 职场文书
python 镜像环境搭建总结
2022/09/23 Python