gpt4 book ai didi

python - 覆盖类的一个实例的 __getattr__ 方法?

转载 作者:行者123 更新时间:2023-11-28 18:34:27 24 4
gpt4 key购买 nike

<分区>

我现在正在从事一个项目,该项目处理抽象数学意义上的函数。为了不让读者厌烦细节,我会说我在早期版本中有以下结构:

class Foo(Bar):
def __init__(self, a, b):
self.a = a
self.b = b
self.sub_unit = Foo(a, not b)

当然,这并不是我对 Foo 的参数所做的完全更改,但足以说明,如果重复访问此属性,将导致无限长的链Foo 对象。显然,当实例化 Foo 时,这会导致无限递归。我在早期版本中通过删除 init 的最后一行并将以下内容添加到 Foo 类中解决了这个问题:

def __getattr__(self, attr: str):
if attr == 'sub_unit':
return Foo(self.a, not self.b)
else:
return super().__getattr__(attr)

这非常有效,因为我可以根据需要计算链中的下一个对象。

不过,在检查代码时,我意识到出于其他原因,我需要 Bar实例,而不是它的子类。为了查看是否可以覆盖单个实例的 getattr,我尝试了以下操作:

>>> foo = Bar(a=1, b=2) # sub_unit doesn't get set here.
>>> foo.__getattr__ = lambda attr: 'foo'
>>> foo.a
1
>>> foo.__getattr__('a')
'foo'

这里发生了什么我不明白的事?为什么 foo.a 不调用 foo.__getattr__('a')

是否有一个很好的方法来覆盖单个实例的 __getattr__,或者我最好的选择是重构所有读取 sub_unit 和 friend 的代码将它们称为函数,以处理这种特殊情况?

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