8

functools.singledispatch有助于定义单调度泛型方法。同时,还有super()调用方法或访问超类的属性。

有没有类似的东西super()可以用singledispatch?我尝试了以下方法,但结果super(Derived, value)只是不是实例Base,所以它没有按我预期的那样工作:

from functools import singledispatch

@singledispatch
def hello(value):
    return ['default']

@hello.register(Base)
def hello_base(value):
    return hello(super(Base, value)) + ['base']

@hello.register(Derived)
def hello_derived(value):
    return hello(super(Derived, value)) + ['derived']

print(hello(Derived())
# expected ['default', 'base', 'derived'],
# but actually is ['default', 'derived'].
4

1 回答 1

2

我相信这样的事情会起作用,但我无法测试它,因为我没有安装 Python 3.4:

def getsuperclass(cls):
    try:
        nextclass = cls.__mro__[1]
    except IndexError:
        raise TypeError("No superclass")
    return nextclass

@singledispatch
def hello(value):
    return ['default']

@hello.register(Base)
def hello_base(value):
    return hello.dispatch(getsuperclass(Base))(value) + ['base']

@hello.register(Derived)
def hello_derived(value):
    return hello.dispatch(getsuperclass(Derived))(value) + ['derived']

print(hello(Derived()))

请注意,以超类作为参数调用并没有真正意义hello,因为如果这样做,您将丢失value传递的原始参数 ( )。在您的情况下,这无关紧要,因为您的函数根本不使用value,但真正的调度函数可能实际上会对该值执行某些操作,因此您需要将该值作为参数传递。

于 2014-08-29T05:03:09.663 回答