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 RuntimeError: thread.__init__() not called解决方法
Apr 28 Python
剖析Django中模版标签的解析与参数传递
Jul 21 Python
浅谈python中set使用
Jun 30 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
python 处理string到hex脚本的方法
Oct 26 Python
python将txt文件读取为字典的示例
Dec 22 Python
Python中常用的8种字符串操作方法
May 06 Python
jupyter notebook 中输出pyecharts图实例
Apr 23 Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 Python
python实现TCP文件传输
Mar 20 Python
python 如何区分return和yield
Sep 22 Python
Python爬虫之Selenium警告框(弹窗)处理
Dec 04 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
重料打造自己的“宝马”---第三代
2021/03/02 无线电
php项目打包方法
2008/02/18 PHP
Yii使用技巧大汇总
2015/12/29 PHP
php set_include_path函数设置 include_path 配置选项
2016/10/30 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
[原创]php使用strpos判断字符串中数字类型子字符串出错的解决方法
2017/04/01 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
jquery tmpl模板(实例讲解)
2017/09/02 jQuery
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
2018/04/21 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
微信小程序 导入图标实现过程详解
2019/10/11 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
python爬虫中get和post方法介绍以及cookie作用
2018/02/08 Python
python pandas dataframe 按列或者按行合并的方法
2018/04/12 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
Django框架多表查询实例分析
2018/07/04 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Django ORM 查询表中某列字段值的方法
2020/04/30 Python
Python使用for生成列表实现过程解析
2020/09/22 Python
企业仓管员岗位职责
2014/06/15 职场文书
元旦晚会活动总结
2014/07/09 职场文书
董事会决议范本
2015/07/01 职场文书
申请吧主发表的感言
2015/08/03 职场文书
MySQL派生表联表查询实战过程
2022/03/20 MySQL