gpt4 book ai didi

python - 如何在没有无限递归错误的情况下实现 __getattribute__?

转载 作者:IT老高 更新时间:2023-10-28 21:11:47 24 4
gpt4 key购买 nike

我想覆盖对类中一个变量的访问,但正常返回所有其他变量。如何使用 __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

最佳答案

您收到递归错误,因为您尝试访问 __getattribute__ 内的 self.__dict__ 属性会再次调用您的 __getattribute__。如果你使用 object__getattribute__ 代替,它可以工作:

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__ 的基本版本,您可以避免之前的递归 hell 。

在 foo.py 中带有代码的 Ipython 输出:

In [1]: from foo import *

In [2]: d = D()

In [3]: d.test
Out[3]: 0.0

In [4]: d.test2
Out[4]: 21

更新:

标题为 More attribute access for new-style classes 的部分中有一些内容在当前文档中,他们建议这样做以避免无限递归。

关于python - 如何在没有无限递归错误的情况下实现 __getattribute__?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/371753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com