Python - __getattr__和__getattribute__的区别
2024-09-05 15:36:50
传送门
- https://docs.python.org/3/reference/datamodel.html#object.__getattr__
- https://docs.python.org/3/reference/datamodel.html#object.__getattribute__
- https://stackoverflow.com/questions/4295678/understanding-the-difference-between-getattr-and-getattribute
- https://stackoverflow.com/questions/3278077/difference-between-getattr-vs-getattribute
区别
- 当正常访问属性失败,即f.x,x不存在,会触发__getattr__
- 无论有无f.x,都会触发__getattibute__
Talk is cheap
__getattr__单个出现
class Foo:
def __init__(self, x):
self.x = x
def __getattr__(self, item):
#return self.__dict__[item]
return '__getattr__'
f1 = Foo(1)
print(f1.x)
print(f1.xxxxxx) #访问不存在的属性访问,触发__getattr__
__getattribute__单个出现
class Foo:
def __init__(self, x):
self.x = x
def __getattribute__(self, item):
return '__getattribute__'
f1 = Foo(1)
print(f1.x) # 访问存在的属性,也会直接执行__getattribute__
print(f1.xxx) # 访问不存在的属性,也会直接执行__getattribute__
__getattr__和__getattibute__同时存在
class Foo:
def __init__(self, x):
self.x = x
def __getattr__(self, item):
return '执行的是我,__getattr__'
# return self.__dict__[item]
def __getattribute__(self, item):
print('不管属性是否存在,我都执行,__getattribute__')
raise AttributeError('__getattribute__的AttributeError')
f1 = Foo(1)
# 当两者同时存在的时候,只会执行__getattribute__;如果在__getattribute__过程中抛出AttributeError,那么就执行__geattr__
print(f1.x)
# print(f1.xx)
18+ Warning
最好不要使用__getattribute__,不然有可能导致无限递归的可能。
最新文章
- C++中虚析构函数的作用
- Hibernate入门6.Hibernate检索方式
- bzoj2823
- jquery easyui datagrid 分页 详解(java)
- Use powerful plugins in your vim.
- [Audio processing] 常见语音特征 —— LPC
- 从零开始学C++之构造函数与析构函数(三):深拷贝与浅拷贝、空类
- SQL 之存储过程
- 【转载】 Sqlserver中查看自定义函数被哪些对象引用
- web富文本编辑器收集
- yii2部署nginx
- python-异常处理、元类
- 006 使用SpringMVC开发restful API四--用户信息的修复与删除,重在注解的定义
- zookeeper使用
- 弹出框插件——dialog
- 1.浅谈CLR
- 数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)
- java中<;load-on-startup>;含义
- Ocelot中文文档入门
- T-SQL 之 存储过程