python的getattr 用于normal attribute lookup fails的情况, 例如某 attribute不存在
而getattribute 会拦截所有的atttribute lookup 操作,不论这个attribute 存在与否
代码更清楚
-
class P:
-
x = 'a'
-
def __init__(self,n=0):
-
self.n = n
-
-
def __getattr__(self,name):
-
return("__geattr__ will be called when normal attribute get failed")
-
-
'''
-
def __getattribute__(self, name):
-
return("__getattribute__ will be called always")
-
'''
-
-
def test_():
-
p = P()
-
print(p.x)
-
print(p.n)
-
print(p.__dict__)
-
#with parameter, equals p.__dict__
-
print(vars(p))
-
#searching for a attribute which is not exist
-
print(p.f)
-
print(getattr(p, 'n'))
-
print(getattr(p, 'x'))
-
-
test_()
-
a
-
0
-
{'n': 0}
-
{'n': 0}
-
__geattr__ will be called when normal attribute get failed
-
0
-
a
-
class B:
-
x = 'ba'
-
def __init__(self,n=100):
-
self.n = n
-
-
def __getattr__(self,name):
-
return("__geattr__ will be called when normal attribute get failed")
-
-
def __getattribute__(self, name):
-
return("__getattribute__ will be called always")
-
-
def test2_():
-
b = B()
-
print(b.x)
-
print(b.n)
-
print(b.__dict__)
-
#With parameter, equals to b.__dict__
-
print(vars(b))
-
#searching for a attribute which is not exist
-
print(b.f)
-
print(getattr(b, 'n'))
-
print(getattr(b, 'x'))
-
-
test2_()
运行结果
-
__getattribute__ will be called always
-
__getattribute__ will be called always
-
__getattribute__ will be called always
-
__getattribute__ will be called always
-
__getattribute__ will be called always
-
__getattribute__ will be called always
-
__getattribute__ will be called always
阅读(84191) | 评论(0) | 转发(0) |