向现有对象实例添加__getattr__方法

时间:2019-05-31 20:55:03

标签: 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;问题是我执行__getattr__时不会自动调用我的a.anything方法。


请注意,在我的实际实现中,我无法修改类A的定义,也不能键入其名称并进行类似A.__getattr__ = ...的操作(这会起作用),因为我需要这是通用的,并且与类名无关。

编辑:我最终是这样做的:

a.__class__.__getattr__ = new_getattr

1 个答案:

答案 0 :(得分:2)

您不能-sign名称是按类型而不是按实例解析的。自定义library(tidyverse) library(anytime) data %>% group_by(grp = cumsum(str_detect(Date, "[A-Z]"))) %>% summarise(Date = anydate(first(Date)), B = sum(sign(A), na.rm = TRUE)) 将需要直接在__dunder__上定义。

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

  

对于自定义类,只有在对对象的类型(而不是在对象的实例字典中)进行定义的情况下,才能保证对特殊方法的隐式调用可以正常工作。

注意::如果您仅引用实例而不是类,则仍然可以通过为__getattr__返回的对象分配一个方法来猴子修补类型。请注意,这将影响所有现有实例,而不仅仅是A实例。