我知道我应该想出一个更好的头衔,但无论如何......
假设我在python中创建了一个继承自int
的类:
class Foo(int):
def is_even(self):
return self%2 == 0
并做这样的事情
a = Foo(3)
b = Foo(5)
print(type(a+b)) #=> <class 'int'>
我理解这种行为并不奇怪,因为此处调用的__add___
被定义为返回int
个实例。但我想创建一个类,以便a+b
返回Foo(8)
。换句话说,我希望结果a+b
具有is_even
方法。
有什么办法可以方便地实现这个目的吗?或者我是否必须覆盖__add__
和所有内容?
背景资料:我正在尝试为an esoteric programming language called Grass编写解释器。在那次尝试中,我希望有一个类似'可调用 - int
'(实际上是numpy.uint8
)的类,其__call__
就像
def __call__(self, other):
if self == other:
return lambda x: lambda y: x
else:
return lambda x: lambda y: y
答案 0 :(得分:1)
您可以使用元类(__metaclass__
类变量)或__getattribute__
特殊方法执行技巧。但the documentation表示:
以这种方式绕过 getattribute ()机制为解释器内的速度优化提供了很大的空间,代价是在处理特殊方法时具有一定的灵活性(必须在class对象本身,以便由解释器一致地调用)
这意味着如果您想确保永远不会直接处理父类,则需要拦截所有内容。对于int,它被描述为emulating numeric types(即:实现所有这些方法)。
那就是说,我相信你可以通过创建一个带有两个参数并且只调用super的lambda或泛型方法,很容易地在你的类中实现所有这些方法。然后将该方法分配给您需要实现的所有特定方法。所以你实施一次并重复使用。