Python:如何在从超类继承的方法下使子类“关闭”

时间:2013-12-14 03:35:37

标签: python class inheritance

我知道我应该想出一个更好的头衔,但无论如何......

假设我在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

1 个答案:

答案 0 :(得分:1)

您可以使用元类(__metaclass__类变量)或__getattribute__特殊方法执行技巧。但the documentation表示:

  

以这种方式绕过 getattribute ()机制为解释器内的速度优化提供了很大的空间,代价是在处理特殊方法时具有一定的灵活性(必须在class对象本身,以便由解释器一致地调用)

这意味着如果您想确保永远不会直接处理父类,则需要拦截所有内容。对于int,它被描述为emulating numeric types(即:实现所有这些方法)。


那就是说,我相信你可以通过创建一个带有两个参数并且只调用super的lambda或泛型方法,很容易地在你的类中实现所有这些方法。然后将该方法分配给您需要实现的所有特定方法。所以你实施一次并重复使用