在python中实例的属性访问都会经过__getattribute__,如果属性找不到则就会调用__getattr__
<span style="font-size:14px;">class A(object):
def __init__(self, name):
self.name = name
def __getattribute__(self, item):
try:
return self.__dict__[item]
except KeyError:
return 'default'
a = A('jack')
print a.name</span>
这里会引发 RuntimeError: maximum recursion depth exceeded。因为self.__dict__这里会调用__getattribute__(self, item),然后就进入无限递归了。这个时候只能用
<span style="font-size:14px;">super(A, self).__getattribute__(item)</span>
或者
<span style="font-size:14px;">object.__getattribute__(self, item)</span>
重载这两个方法需要有一些注意点:
重载__getattribute__方法会一般都会比默认的慢一些;重载__getattr__可能会影响hasattr()这样的函数