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根据路径导入模块的方法
Sep 30 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
python绘制圆柱体的方法
Jul 02 Python
浅谈Python脚本开头及导包注释自动添加方法
Oct 27 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
python读写csv文件并增加行列的实例代码
Aug 01 Python
Python上下文管理器全实例详解
Nov 12 Python
在python中创建指定大小的多维数组方式
Nov 28 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
Python collections模块的使用方法
Oct 09 Python
python中判断数字是否为质数的实例讲解
Dec 06 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
全国FM电台频率大全 - 5 内蒙古自治区
2020/03/11 无线电
libmysql.dll与php.ini是否真的要拷贝到c:\windows目录下呢
2010/03/15 PHP
PHP生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
基于PHP读取csv文件内容的详解
2013/06/18 PHP
php获取文件内容最后一行示例
2014/01/09 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
PHP 实现缩略图
2021/03/09 PHP
JavaScript中的私有成员
2006/09/18 Javascript
jquery select(列表)的操作(取值/赋值)
2011/03/16 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
javascript动态加载二
2012/08/22 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
JavaScript+html5 canvas绘制的小人效果
2016/01/27 Javascript
关于不同页面之间实现参数传递的几种方式讨论
2017/02/13 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
Js利用Canvas实现图片压缩功能
2017/09/13 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
微信小程序实现搜索框功能及踩过的坑
2020/06/19 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
vue实现登录功能
2020/12/31 Vue.js
对PyTorch torch.stack的实例讲解
2018/07/30 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
Python实现制度转换(货币,温度,长度)
2019/07/14 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
Django权限控制的使用
2021/01/07 Python
安全生产标语
2014/06/06 职场文书
2015年重阳节慰问信
2015/03/23 职场文书
单位计划生育责任书
2015/05/09 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
Java实现聊天机器人完善版
2021/07/04 Java/Android
dubbo服务整合zipkin详解
2021/07/26 Java/Android
MySQL七大JOIN的具体使用
2022/02/28 MySQL