我想这样做:
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
。
答案 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
实例。