【发布时间】:2012-11-24 04:39:05
【问题描述】:
方法__getattribute__需要仔细编写,以避免死循环。例如:
class A:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.x
>>> a = A()
>>> a.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
class B:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
return self.__dict__[x]
>>> b = B()
>>> b.x # infinite looop
RuntimeError: maximum recursion depth exceeded while calling a Python object
因此我们需要这样写方法:
class C:
def __init__(self):
self.x = 100
def __getattribute__(self, x):
# 1. error
# AttributeError: type object 'object' has no attribute '__getattr__'
# return object.__getattr__(self, x)
# 2. works
return object.__getattribute__(self, x)
# 3. works too
# return super().__getattribute__(x)
我的问题是为什么object.__getattribute__ 方法有效? object 从哪里得到__getattribute__ 方法?如果object 没有任何__getattribute__,那么我们只是在类C 上调用相同的方法,但通过超类。为什么,那么通过超类调用方法不会导致死循环?
【问题讨论】:
-
您确定需要
__getattribute__而不是__getattr__? -
是的,我是,因为我需要拦截所有在我的类中获取的属性。但即使我没有,我仍然想知道为什么会这样的全部细节。
-
好吧,要么你必须拦截 all 属性访问,要么你不需要:-)
-
@MartijnPieters——我同意。我的主要困惑是为什么从
object调用 SAME 方法不会导致无限递归。 -
为什么说“对象没有
__getattribute__”?a = object(); dir(a)你会看到它列出来...
标签: python python-3.x