我知道我应该想出一个更好的标题,但无论如何......
假设我在 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 编写解释器.在那次尝试中,我想要一个行为类似于“callable-int”(实际上是 numpy.uint8)的类,其 __call__ 会像
def __call__(self, other):
if self == other:
return lambda x: lambda y: x
else:
return lambda x: lambda y: y
.
请您参考如下方法:
您可以使用元类(__metaclass__ 类变量)或 __getattribute__ 特殊方法来技巧。但是the documentation状态:
Bypassing the getattribute() machinery in this fashion provides significant scope for speed optimisations within the interpreter, at the cost of some flexibility in the handling of special methods (the special method must be set on the class object itself in order to be consistently invoked by the interpreter)
这意味着如果你想确保永远不会直接处理父类,你需要拦截一切。对于 int,它被描述为 emulating numeric types (即:实现所有这些方法)。
就是说,我相信您可以通过创建一个采用两个参数并仅对它们调用 super 的 lambda 或泛型方法,轻松地在您的类中实现所有这些方法。然后将该方法分配给您需要实现的所有特定方法。因此,您只需实现一次即可重用。
