正在将“\uu getattr\uuu”方法添加到现有对象实例

2024-04-20 13:07:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望这能起作用:

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。你知道吗


Tags: importselfnewreturninitdefargspass
1条回答
网友
1楼 · 发布于 2024-04-20 13:07:18

不能对类型而不是每个实例解析__dunder__名称。自定义__getattr__需要直接在A上定义。你知道吗

请参见数据模型文档的Special method lookup部分,具体如下:

For custom classes, implicit invocations of special methods are only guaranteed to work correctly if defined on an object’s type, not in the object’s instance dictionary.

注意:如果您只有一个实例的引用,而不是类的引用,那么仍然可以通过向type(a)返回的对象分配一个方法来monkeypatch类型。请注意,这将影响所有现有实例,而不仅仅是a实例。你知道吗

相关问题 更多 >