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 26 Python
Python脚本处理空格的方法
Aug 08 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
python爬虫爬取网页表格数据
Mar 07 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python重新加载模块的实现方法
Oct 16 Python
python实现石头剪刀布小游戏
Jan 20 Python
Appium+Python自动化测试之运行App程序示例
Jan 23 Python
Python eval函数原理及用法解析
Nov 14 Python
python爬虫如何解决图片验证码
Feb 14 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
python 模拟在天空中放风筝的示例代码
Apr 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
也谈php网站在线人数统计
2008/04/09 PHP
PHP自定义函数收代码
2010/08/01 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
Zend Framework动作控制器用法示例
2016/12/09 PHP
PHP异常处理定义与使用方法分析
2017/07/25 PHP
JavaScript的变量作用域深入理解
2009/10/25 Javascript
js内存泄露的几种情况详细探讨
2013/05/31 Javascript
node.js中的fs.readlinkSync方法使用说明
2014/12/17 Javascript
使用PHP+JavaScript将HTML页面转换为图片的实例分享
2016/04/18 Javascript
JavaScript函数柯里化详解
2016/04/29 Javascript
基于cssSlidy.js插件实现响应式手机图片轮播效果
2016/08/30 Javascript
webpack配置sass模块的加载的方法
2017/07/30 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
js实现图片推拉门效果代码实例
2019/05/18 Javascript
js Array.slice的8种不同用法示例
2019/07/10 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
深入Python函数编程的一些特性
2015/04/13 Python
python避免死锁方法实例分析
2015/06/04 Python
正确理解python中的关键字“with”与上下文管理器
2017/04/21 Python
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
python 变量初始化空列表的例子
2019/11/28 Python
Python 音频生成器的实现示例
2019/12/24 Python
突袭HTML5之Javascript API扩展1—Web Worker异步执行及相关概述
2013/01/31 HTML / CSS
纽约JewelryAffairs珠宝店:精细金银时尚首饰
2017/02/05 全球购物
英国第一的购买便宜玩具和游戏的在线购物网站:Bargain Max
2018/01/24 全球购物
世界顶级俱乐部的官方球衣和套装:Subside Sports
2018/04/22 全球购物
IBatis持久层技术
2016/07/18 面试题
优秀中学生事迹材料
2014/01/31 职场文书
幼儿园毕业家长感言
2014/02/10 职场文书
绿化工程实施方案
2014/03/17 职场文书
关键在于落实心得体会
2014/09/03 职场文书