首先理解__getattribute__的用法,先看代码:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,obj):print("哈哈")return object.__getattribute__(self,obj)
aa = Tree("大树")
print(aa.name)

执行结果是:

哈哈
大树

为什么会这个结果呢?
__getattribute__是属性访问拦截器,就是当这个类的属性被访问时,会自动调用类的__getattribute__方法。即在上面代码中,当我调用实例对象aa的name属性时,不会直接打印,而是把name的值作为实参传进__getattribute__方法中(参数obj是我随便定义的,可任意起名),经过一系列操作后,再把name的值返回。Python中只要定义了继承object的类,就默认存在属性拦截器,只不过是拦截后没有进行任何操作,而是直接返回。所以我们可以自己改写__getattribute__方法来实现相关功能,比如查看权限、打印log日志等。如下代码,简单理解即可:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,*args,**kwargs):if args[0] == "大树"print("log 大树")return "我爱大树"else:return object.__getattribute__(self,*args,**kwargs)
aa = Tree("大树")
print(aa.name)
print(aa.cate)

结果是:

log 大树
我爱大树
plant

另外,注意注意:
初学者用__getattribute__方法时,容易栽进这个坑,什么坑呢,直接看代码:

class Tree(object):def __init__(self,name):self.name = nameself.cate = "plant"def __getattribute__(self,obj):if obj.endswith("e"):return object.__getattribute__(self,obj)else:return self.call_wind()def call_wind(self):return "树大招风"
aa = Tree("大树")
print(aa.name)#因为name是以e结尾,所以返回的还是name,所以打印出"大树"
print(aa.wind)#这个代码中因为wind不是以e结尾,#所以返回self.call_wind的结果,打印的是"树大招风"

上面的解释正确吗?
先说结果,关于print(aa.name)的解释是正确的,但关于print(aa.wind)的解释不对,为什么呢?我们来分析一下,执行aa.wind时,先调用__getattribute__方法,经过判断后,它返回的是self.call_wind(),即self.call_wind的执行结果,但当去调用aa这个对象的call_wind属性时,前提是又要去调用__getattribute__方法,反反复复,没完没了,形成了递归调用且没有退出机制,最终程序就挂了!

Python 属性__getattribute__相关推荐

  1. Python属性和内建属性

    属性property 1. 私有属性添加getter和setter方法 class Money(object):def __init__(self):self.__money = 0def getMo ...

  2. 有效的python属性管理:描述符的使用

    前言 最近使用描述符对自己的催化动力学模拟程序进行了改进,在Python描述符的帮助下实现了更加灵活而且强大有效的属性管理,使得程序各个组件的数据封装更加完善管理也更加有条理. 本文就以自己程序中运用 ...

  3. python属性_Python属性()

    python属性 Python property() function returns a property attribute. It's mostly used to create a manag ...

  4. python中iadd与add_如何为Python属性实现-uyu iadd_uu

    我试图创建一个Python属性,其中就地添加是由不同的方法处理的,而不是检索值.添加另一个值并重新赋值.因此,对于对象o上的属性xo.x += 5 应该不同于 ^{pr2}$ o.x的值最终应该是相同 ...

  5. python属性_python属性定义

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在java里, 若要为一个类定义只读的属性, 只需要将目标属性用private修 ...

  6. Python属性拦截器之__getattribute__与__getattr__

    在Python中自定义了很多内建属性,如__getattribute__(),即属性访问拦截器,它的作用是当我们访问实例对象的属性时,并不会立即返回属性的值,而是自动调用__getattribute_ ...

  7. Python的__getattribute__ vs __getattr__的妙用

    这里的属性即包括属性变量,也包括属性方法.即类的变量和方法. 当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找 ...

  8. Python属性访问拦截器的用法

    __ getattribute__()方法是属性访问时的拦截器,每当访问属性的时候,会先执行这个方法,然后再执行访问属性的操作步骤,可以用来记录属性访问的log. 简单说,想知道谁访问了你的某个变量, ...

  9. python属性访问顺序_Python 对象属性的访问

    在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...

最新文章

  1. 关于tinymce的一些记事
  2. jQuery监控页面所有ajax请求的方法
  3. linux_一些shell命令分析记录
  4. JavaScript中获取表单信息并添加在表格中
  5. 的技术难点_马铃薯收获机研究的技术难点与使用注意事项
  6. hibernate mysql 映射_hibernate与mysql映射类型对应表与mysql导入导出
  7. MacOS中使用QT开发iOS应用
  8. Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载
  9. layui 加载第三方插件
  10. centos7---mysql5.7主从复制读写分离
  11. Linux umask and chmod
  12. win7 64位系统安装HP LaserJet 5100 PCL 6
  13. scp 给ipv6_scp传输常用命令
  14. 数据化是什么,企业为什么要数据化管理?【Teamface企典】
  15. ARM汇编寄存器和常用指令详解
  16. Android 通用流行框架梳理
  17. VerA 0.15 by PE_kill
  18. hdu3397 线段树
  19. AndroidStudio安装SVN时忘记勾选command line client tools解决方案
  20. 2019阿里巴巴内推首轮面试总结

热门文章

  1. vs2012下编码引起的一个神坑
  2. leetcode 438. Find All Anagrams in a String 滑动窗口法
  3. 全面理解Python中的类型提示(Type Hints)
  4. Debug常用指令和DOSBox使用步骤
  5. 关于Numba的线程实现的说明
  6. nvGRAPH API参考分析(一)
  7. 激光雷达Lidar Architecture and Lidar Design(上)
  8. 中国人工智能AI框架自主研发
  9. Python 应用领域以及版本之间的区别
  10. 面部表情视频中进行远程心率测量:ICCV2019论文解析