6

functools.singledispatch은 단일 디스패치 일반 메서드를 정의하는 데 도움이됩니다. 한편 메소드를 호출하거나 수퍼 클래스의 속성에 액세스하는 데는 super()이 있습니다.functools.singledispatch에 대한 super()와 같습니다.

singledispatch과 함께 사용할 수있는 super()과 같은 것이 있습니까? 나는 다음을 시도했지만 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']. 

답변

2

나는 이런 식으로 뭔가가 작동 할 것이라고 생각하지만, 나는 이후를 테스트 할 수 없습니다 파이썬 3.4이 설치되지 않은 : 정말, 인수로 슈퍼 클래스와 hello를 호출하는 이해가되지 않습니다

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())) 

주 당신이 원래의 인수 (value)를 잃을 것이라고했다면 그 때문에 통과되었다. 귀하의 경우에는 함수가 value을 전혀 사용하지 않기 때문에 중요하지 않지만 실제 디스패치 함수는 실제로 값으로 무언가를 수행 할 것이므로 값을 인수로 전달해야합니다.