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 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python操作MySQL数据库具体方法
Oct 28 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
Python Numpy 数组的初始化和基本操作
Mar 13 Python
python 同时运行多个程序的实例
Jan 07 Python
python面试题小结附答案实例代码
Apr 11 Python
python3实现弹弹球小游戏
Nov 25 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
解决Jupyter无法导入已安装的 module问题
Apr 17 Python
keras load model时出现Missing Layer错误的解决方式
Jun 11 Python
一个非常简单好用的Python图形界面库(PysimpleGUI)
Dec 28 Python
python 提取html文本的方法
May 20 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 命令行参数详解及应用
2011/05/18 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
php生成curl命令行的方法
2015/12/14 PHP
jquery 插件之仿“卓越亚马逊”首页弹出菜单效果
2008/12/25 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
js实现网页抽奖实例
2015/08/05 Javascript
理解javascript闭包
2015/12/15 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
js仿京东轮播效果 选项卡套选项卡使用
2017/01/12 Javascript
解析jquery easyui tree异步加载子节点问题
2017/03/08 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
js时间戳与日期格式之间转换详解
2017/12/11 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
js实现网页同时进行多个倒计时功能
2019/02/25 Javascript
Vue实现回到顶部和底部动画效果
2019/07/31 Javascript
Vue在chrome44偶现点击子元素事件无法冒泡的解决方法
2019/12/15 Javascript
JS实现网页端猜数字小游戏
2020/03/06 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
js实现扫雷源代码
2020/11/27 Javascript
go和python调用其它程序并得到程序输出
2014/02/10 Python
Python sys.argv用法实例
2015/05/28 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
Pandas0.25来了千万别错过这10大好用的新功能
2019/08/07 Python
python里反向传播算法详解
2020/11/22 Python
使用HTML5做个画图板的方法介绍
2013/05/03 HTML / CSS
加拿大户外探险购物网站:SAIL
2020/06/27 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
项目副经理岗位职责
2013/12/30 职场文书
干部作风建设心得体会
2014/10/22 职场文书
2015年“7.11”世界人口日宣传活动方案
2015/05/06 职场文书
交通事故被告代理词
2015/05/23 职场文书
《月球之谜》教学反思
2016/02/20 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书