我希望这能起作用:
import types
def new_getattr(self, *args, **kwargs):
return 2
class A:
def __init__(self):
pass
a = A()
a.__getattr__ = types.MethodType(new_getattr, a)
print(a.anything)
现在,它抛出AttributeError: A instance has no attribute 'anything'
。你知道吗
我尝试了here提出的不同解决方案,它们都有效,但不适用于__getattr__
。你知道吗
如果我做print(a.__getattr__('anything'))
,它实际上会打印2
;问题是当我做a.anything
时,我的__getattr__
方法不会自动调用。你知道吗
顺便说一句,在我的实际实现中,我不能修改类A
的定义,也不能键入它的名称并执行类似于A.__getattr__ = ...
的操作(这会起作用),因为我需要它是泛型的并且独立于类名。你知道吗
编辑:我最后是这样做的:
a.__class__.__getattr__ = new_getattr
。你知道吗
不能对类型而不是每个实例解析
__dunder__
名称。自定义__getattr__
需要直接在A
上定义。你知道吗请参见数据模型文档的Special method lookup部分,具体如下:
注意:如果您只有一个实例的引用,而不是类的引用,那么仍然可以通过向
type(a)
返回的对象分配一个方法来monkeypatch类型。请注意,这将影响所有现有实例,而不仅仅是a
实例。你知道吗相关问题 更多 >
编程相关推荐