我想覆盖对类中一个变量的访问,但通常返回所有其他变量。我该怎么做__getattribute__呢?
__getattribute__
我尝试了以下操作(它也应说明我要执行的操作),但是出现了递归错误:
class D(object): def __init__(self): self.test=20 self.test2=21 def __getattribute__(self,name): if name=='test': return 0. else: return self.__dict__[name] >>> print D().test 0.0 >>> print D().test2 ... RuntimeError: maximum recursion depth exceeded in cmp
您收到递归错误,因为您尝试访问其中的self.__dict__属性会再次__getattribute__调用您__getattribute__。如果你使用object的__getattribute__不是,它的工作原理:
self.__dict__
object
class D(object): def __init__(self): self.test=20 self.test2=21 def __getattribute__(self,name): if name=='test': return 0. else: return object.__getattribute__(self, name)
之所以有效,是因为object(在此示例中)是基类。通过调用您的基本版本,__getattribute__可以避免您以前遇到的递归地狱。
IPython的输出与foo.py中的代码:
In [1]: from foo import * In [2]: d = D() In [3]: d.test Out[3]: 0.0 In [4]: d.test2 Out[4]: 21
更新:
在当前文档中,标题为“ 针对新样式类的更多属性访问 ”的部分中有一些内容,他们建议确切地执行此操作以避免无限递归。