一、 引言
在《第7.23节 Python使用property函数定义属性简化属性访问的代码实现》和《第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解》中介绍了两种设置属性访问方法,通过设置可以在相关属性访问时调用对应的方法执行访问,支持属性简单访问(如对象名.属性名、赋值语句)、或者为了控制访问逻辑使用的。那么property函数其中的fget、@property装饰器的getter之间的关系是怎样的呢?下面我们通过案例来进行分析。

二、 案例

  1. 案例说明:
    本案例定义类Car,其中有二个实例变量power、totaldistance、三个实例方法(构造方法、__ getattribute__方法、gettotaldistance方法)、一个装饰器和一个property函数定义属性变量语句。
    在__ getattribute__方法中将所有访问实例属性的属性名输出,并调用父类object类的__ getattribute__方法返回真正的数据。
    装饰器将实例变量power定义为carpower属性输出,虽然二者的值是一样的,但是两个不同的实例属性;
    property函数定义了totaldist属性,该属性输出的是实例变量totaldistance的值,二者值相同但实际上也是不同实例变量。然后我们执行totaldist和carpower的读取,看看输出是怎样的?
  2. 案例代码
>>> class Car(): def __init__(self, power):self.power = powerself.totaldistance = 10def __getattribute__(self, properyname):print("In __getattribute__,you are getting  properyty: {}".format(properyname))return object.__getattribute__(self, properyname)  @property  def carpower(self): #定义carpower属性的getter只读装饰器函数print("execute carpower")return self.powerdef gettotaldistance(self):print("execute gettotaldistance")return self.totaldistance #定义property的fget函数totaldist = property(gettotaldistance,None,None,'车辆行驶总里程')  #定义totaldist属性>>> car = Car('汽油发动机')
>>> car.carpower  #获取装饰器@property 定义属性carpower
In __getattribute__,you are getting  properyty: carpower
execute carpower
In __getattribute__,you are getting  properyty: power
'汽油发动机'
>>> car.totaldist #获取内置函数property 定义属性totaldist
In __getattribute__,you are getting  properyty: totaldist
execute gettotaldistance
In __getattribute__,you are getting  properyty: totaldistance
10
>>>
  1. 案例截屏
  2. 案例说明
    通过以上案例可以看出,使用装饰器@property 或property函数定义的属性(下称”定义属性”)访问过程是这样的:
    1> 执行__ getattribute__方法去访问“定义属性”;
    2> 调用@property的getter 或property类型的fget去执行具体的访问方法;
    3> 访问方法访问具体实例变量数据,再次触发__ getattribute__方法返回真正的数据。

三、 总结
通过上述案例及分析, property的fget、@property装饰器getter两者是基本是相同的,只是两种不同的实现,为了描述方便,后面统称为“property的get方法”。
__getattribute__与“property的get方法”之间的异同点如下:

  1. 都能在对实例对象进行属性get时触发,但“property的get方法”只能针对一个“定义属性”,而__getattribute__能针对所有属性包括特殊变量进行触发,触发后参数中有具体属性名;
  2. “property的get方法”只能针对“定义属性”的实例变量,而__getattribute__还能针对实例方法;
  3. 两者在解释器使用dir、type、help访问属性时触发,只不过“property的get方法”只能针对“定义属性”触发,而__getattribute__针对实例方法和所有实例变量;
  4. “property的get方法”返回数据一般是对应方法直接访问实例(self.属性)变量,而__getattribute__不能直接访问实例(self.属性)变量,否则会触发递归调用,只能用父类的__getattribute__方法返回数据;
  5. “定义属性”由于是针对实例变量进行了查询或查询后经过运算返回的,因此它的访问首先会执行__getattribute__方法去访问“定义属性”的数据,然后该访问被定向到绑定的get方法,该get方法会再次触发__getattribute__方法去访问实际需要访问的实例变量,因此使用“property的get方法”去查询“定义属性”的数据时,肯定会触发至少两次__getattribute__方法的执行(次数需要看“property的get方法”去查询的实例变量有多少个);
  6. __getattribute__方法是截获所有通过“实例名.属性名”访问实例变量、类变量、实例方法的所有操作来控制对属性的访问,而“property的get方法”则是为了方便访问数据,提高代码的易读性而实施的属性和方法的绑定。

本节结合案例深入分析了__getattribute__方法与“property的get方法”的异同点,。
老猿Python,跟老猿学Python!
博客地址:https://blog.csdn.net/LaoYuanPython
请大家多多支持,点赞、评论和加关注!谢谢!

第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析相关推荐

  1. 第8.23节 Python中使用sort/sorted排序与“富比较”方法的关系分析

    一. 引言 <第8.21节 Python中__lt__.gt__等 "富比较"("rich comparison")方法用途探究>和<第8.2 ...

  2. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  3. python的抽象类详解_第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类...

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不是以继 ...

  4. python装饰器 property_Python中@property装饰器的使用技巧性解析(代码示例)

    Python中@property装饰器的技巧性用法(代码示例) 本篇文章给大家带来的内容是关于Python中@property装饰器的技巧性用法(代码示例),有一定的参考价值,有需要的朋友可以参考一下 ...

  5. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

  6. python grpc unary call错误_python的黑魔法-装饰器

    python的装饰器 装饰器 简单的来说就是函数的函数,在执行目标函数时,先执行装饰器函数,很像HOOk 简单的装饰器 实现一个打印日志的装饰器 def myLogger(func):def wrap ...

  7. python多个for的执行顺序-python_装饰器篇(多个装饰器下的执行顺序)

    在之前的帖子中,简单自我总结了装饰器的几个情况以及基本上使用,那么有基本上说的都是单个的装饰器修饰方法 有时候我们会发现一个方法上面有多个装饰器 如下: @dec2 @dec def a(a): if ...

  8. python正则怎么取反_第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反...

    一.引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩展 ...

  9. 第11.19节 Python 中正则表达式的扩展功能:前视断言和前视取反

    一. 引言 在<第11.16节 Python正则元字符"()"(小括号)与组(group)匹配模式>中老猿介绍了组匹配模式的命名组功能及引用组功能,这两者都是组模式的扩 ...

最新文章

  1. 空中悬停、翻滚转身、成功着陆,我用强化学习「回收」了SpaceX的火箭
  2. 解决Fiddler不能监听Java HttpURLConnection请求的方法
  3. 用Jquery自己开发个代阴影的对话框吧!
  4. 音视频直播--技术架构
  5. java的visitor模式_java设计模式(二十一)访问者模式(Visitor)
  6. oracle windows server 2008,Node.js 在 Windows Server 2008 X64 连接Oracle 数据库
  7. 如何打造高质量的SSP广告引擎(内部干货分享)
  8. 【我来解惑】.Net应该学什么怎么学(二)
  9. chromium的部署工具depot_tools和gclient
  10. Excel解析的几种实现方式
  11. (二)NI采集卡应用学习:使用NI MAX创建测量任务及常见错误
  12. 【DirectX 9.0c入门教程】之一 开发环境搭建:安装vs2008 sp1和DirectX SDK
  13. Linux下最好用的中文输入法 scim
  14. 【Python】唯品会购买商品
  15. nvidia-driver-460防止驱动更新
  16. Vue项目supermall仿蘑菇街详解(一)首页开发详解
  17. css 唤醒qq聊天,移动端唤起QQ聊天
  18. 武汉理工大学计算机考研复试资料,武汉理工大学计算机考研复试
  19. python敏感词过滤代码简单代码,Python学习笔记系列——读写文件以及敏感词过滤器的实现...
  20. 使用X-SCANNER扫描工具

热门文章

  1. R-知识点总结(来自:http://www.cnblogs.com/changbosha/p/5745288.html)
  2. Word控件Spire.Doc 【打印】教程(3):如何在自定义纸张尺寸上打印 Word—C#/VB.NET
  3. linux与windows键鼠共享,安装SYNERGY完美配置Windows,Linux共用一套键鼠
  4. FindWindow
  5. s8 android内核 费电,Android 9.0 或加速 Galaxy S8/9 电池消耗 谨慎更
  6. 【优化求解】基于matlab蚁群算法配电网故障定位【含Matlab源码 165期】
  7. webpack 打包图片文件
  8. 8647服务器装系统,东芝Astrea笔记本怎么安装win10系统
  9. 什么是WindowServer进程,为什么它在Mac上运行?
  10. 详解Eclipse集成Jad反编译工具