1、回顾__getattr__
当调用一个不存在的属性时,就会触发__getattr__()
class Foo:
def __init__(self,x):
self.x=x
def __getattr__(self, item):
print('执行的是我')
# return self.__dict__[item]
f1=Foo(10)
print(f1.x)
f1.xxxxxx # 不存在的属性访问,触发__getattr__
结果:
10
执行的是我
2、__getattribute__
class Foo:
def __init__(self,x):
self.x=x
def __getattribute__(self, item):
print('不管是否存在,我都会执行')
f1=Foo(10)
f1.x # 不管是否存在,我都会执行
f1.xxxxxx # 不管是否存在,我都会执行
3、二者同时出现
当__getattribute__与__getattr__同时存在,只会执行__getattribute__,除非__getattribute__在执行过程中抛出异常AttributeError
#_*_coding:utf-8_*_
class Foo:
def __init__(self,x):
self.x=x
def __getattr__(self, item):
print('执行的是我')
# return self.__dict__[item]
def __getattribute__(self, item):
print('不管是否存在,我都会执行')
raise AttributeError('哈哈')
f1=Foo(10)
f1.x
f1.xxxxxx
结果:
不管是否存在,我都会执行
执行的是我
不管是否存在,我都会执行
执行的是我
4、__getattribute__方法在python中的实现是先判断属性是否存在,存在则返回,不存在则抛出异常进入__getattr __()
class Foo(object):
def __init__(self, y):
self.y = y
def __getattr__(self, item):
print("执行的是getattr")
def __getattribute__(self, item):
if object.__getattribute__(self, item):
return object.__getattribute__(self, item)
else:
raise AttributeError
f1 = Foo(10)
print(f1.y)
f1.xxx
结果:
10
执行的是getattr