gpt4 book ai didi

python - 理解 __getattribute__

转载 作者:行者123 更新时间:2023-12-01 05:17:01 24 4
gpt4 key购买 nike

class Shadow(object):
pass

class Test(object):
a = 1
b = 2

_shadow = Shadow()

def __getattribute__(self, name):
try:
return object.__getattribute__(self._shadow, name)
except: print "not shadowed"
return object.__getattribute__(self, name)

通过上面的代码,我想实现以下行为:

>>>t = Test()
>>>t.a
1
>>>t._shadow.a = 17
>>>t.a
17
>>>t.b
2

代码可以工作,但它会打印“未阴影”M次(直到达到递归深度)。问题是为什么,不应该涉及任何递归,我正在调用 object.__getattribute__ 而不是 self.__getattribute__

最佳答案

__getattribute__所有 属性访问调用,包括 self._shadow。但由于您已覆盖 __getattribute__self._shadow 会触发无限递归。

唯一的解决方法是使用 object.__getattribute__ 或更好的 super(Test, self).__getattribute__ 来检索 _shadow 属性:

class Test(object):
a = 1
b = 2

_shadow = Shadow()

def __getattribute__(self, name):
shadow = super(Test, self).__getattribute__('_shadow')
try:
return getattr(shadow, name)
except AttributeError:
print "not shadowed"
return super(Test, self).__getattribute__(name)

无需使用object.__getattribute__来访问影子对象的属性。不要使用 Pokemon 风格的异常处理(你不想捕获所有异常);此处仅捕获特定的 AttributeError 异常。

演示:

>>> t = Test()
>>> t.a
not shadowed
1
>>> t._shadow.a = 42
not shadowed
>>> t.a
42

请注意,在这里,访问 t._shadow 会在通过 __getattribute__ 处理程序时触发 'not Shadowed' 消息。

关于python - 理解 __getattribute__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22986546/

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