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中函数的参数传递与可变长参数介绍
Jun 30 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
Python中的Numpy矩阵操作
Aug 12 Python
Python第三方Window模块文件的几种安装方法
Nov 22 Python
Pandas DataFrame数据的更改、插入新增的列和行的方法
Jun 25 Python
Python从文件中读取指定的行以及在文件指定位置写入
Sep 06 Python
分享一个pycharm专业版安装的永久使用方法
Sep 24 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
Feb 27 Python
python:删除离群值操作(每一行为一类数据)
Jun 08 Python
Matplotlib中rcParams使用方法
Jan 05 Python
Python opencv缺陷检测的实现及问题解决
Apr 24 Python
python 实现图与图之间的间距调整subplots_adjust
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
ajax+php打造进度条代码[readyState各状态说明]
2010/04/12 PHP
PHP无限分类(树形类)
2013/09/28 PHP
浅谈php自定义错误日志
2015/02/13 PHP
PHP实现过滤各种HTML标签
2015/05/17 PHP
php微信公众号开发之音乐信息
2018/10/20 PHP
php链式操作的实现方式分析
2019/08/12 PHP
Javascript 陷阱 window全局对象
2008/11/26 Javascript
深入理解JavaScript系列(2) 揭秘命名函数表达式
2012/01/15 Javascript
javascript作用域容易记错的两个地方分析
2012/06/22 Javascript
JavaScript实现url地址自动检测并添加URL链接示例代码
2013/11/12 Javascript
JavaScript中实现PHP的打乱数组函数shuffle实例
2014/10/11 Javascript
jQuery中:not选择器用法实例
2014/12/30 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
利用JS提交表单的几种方法和验证(必看篇)
2016/09/17 Javascript
jQuery 局部div刷新和全局刷新方法总结
2016/10/05 Javascript
AngularJS控制器controller给模型数据赋初始值的方法
2017/01/04 Javascript
详解Javascript几种跨域方式总结
2017/02/27 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
JavaScript面向对象中接口实现方法详解
2019/07/24 Javascript
在layui中使用form表单监听ajax异步验证注册的实例
2019/09/03 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
[01:08]DOTA2次级职业联赛 - Shield战队宣传片
2014/12/01 DOTA
浅谈python中列表、字符串、字典的常用操作
2017/09/19 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
Django csrf 验证问题的实现
2018/10/09 Python
python列表使用实现名字管理系统
2019/01/30 Python
pandas DataFrame创建方法的方式
2019/08/02 Python
小学教师的个人自我鉴定
2013/10/26 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
四查四看整改措施
2014/09/19 职场文书
文明旅游倡议书
2015/04/28 职场文书
导师鉴定意见
2015/06/05 职场文书
MySQL中日期型单行函数代码详解
2021/06/21 MySQL