Python 属性__getattribute__
首先理解__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__相关推荐
- Python属性和内建属性
属性property 1. 私有属性添加getter和setter方法 class Money(object):def __init__(self):self.__money = 0def getMo ...
- 有效的python属性管理:描述符的使用
前言 最近使用描述符对自己的催化动力学模拟程序进行了改进,在Python描述符的帮助下实现了更加灵活而且强大有效的属性管理,使得程序各个组件的数据封装更加完善管理也更加有条理. 本文就以自己程序中运用 ...
- python属性_Python属性()
python属性 Python property() function returns a property attribute. It's mostly used to create a manag ...
- python中iadd与add_如何为Python属性实现-uyu iadd_uu
我试图创建一个Python属性,其中就地添加是由不同的方法处理的,而不是检索值.添加另一个值并重新赋值.因此,对于对象o上的属性xo.x += 5 应该不同于 ^{pr2}$ o.x的值最终应该是相同 ...
- python属性_python属性定义
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在java里, 若要为一个类定义只读的属性, 只需要将目标属性用private修 ...
- Python属性拦截器之__getattribute__与__getattr__
在Python中自定义了很多内建属性,如__getattribute__(),即属性访问拦截器,它的作用是当我们访问实例对象的属性时,并不会立即返回属性的值,而是自动调用__getattribute_ ...
- Python的__getattribute__ vs __getattr__的妙用
这里的属性即包括属性变量,也包括属性方法.即类的变量和方法. 当访问某个实例属性时, getattribute会被无条件调用,如未实现自己的getattr方法,会抛出AttributeError提示找 ...
- Python属性访问拦截器的用法
__ getattribute__()方法是属性访问时的拦截器,每当访问属性的时候,会先执行这个方法,然后再执行访问属性的操作步骤,可以用来记录属性访问的log. 简单说,想知道谁访问了你的某个变量, ...
- python属性访问顺序_Python 对象属性的访问
在 Python 中,一切皆对象.属性访问可以理解为是从一个已有的对象中获得另一个对象的方法.对象属性的访问涉及到对象的 __dict__ 属性.描述符等概念,以及 __getattribute__. ...
最新文章
- 关于tinymce的一些记事
- jQuery监控页面所有ajax请求的方法
- linux_一些shell命令分析记录
- JavaScript中获取表单信息并添加在表格中
- 的技术难点_马铃薯收获机研究的技术难点与使用注意事项
- hibernate mysql 映射_hibernate与mysql映射类型对应表与mysql导入导出
- MacOS中使用QT开发iOS应用
- Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载
- layui 加载第三方插件
- centos7---mysql5.7主从复制读写分离
- Linux umask and chmod
- win7 64位系统安装HP LaserJet 5100 PCL 6
- scp 给ipv6_scp传输常用命令
- 数据化是什么,企业为什么要数据化管理?【Teamface企典】
- ARM汇编寄存器和常用指令详解
- Android 通用流行框架梳理
- VerA 0.15 by PE_kill
- hdu3397 线段树
- AndroidStudio安装SVN时忘记勾选command line client tools解决方案
- 2019阿里巴巴内推首轮面试总结