2014-08-29 14 views
6

functools.singledispatch consente di definire un metodo generico a singola spedizione. Nel frattempo, c'è super() per chiamare i metodi o accedere agli attributi di una superclasse.Equivale a super() per functools.singledispatch

C'è qualcosa come super() che può essere utilizzato con singledispatch? Ho provato quanto segue, ma il risultato di super(Derived, value) non è solo un'istanza di Base, quindi non funziona come mi aspettavo:

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']. 

risposta

2

credo che qualcosa di simile a questo lavoro, ma non posso provarlo dal non ho Python 3.4 installato:

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

si noti che in realtà non ha senso chiamare hello con la superclasse come argomento, perché se avete fatto che si perderebbe l'argomento originale (value) che è passato. Nel tuo caso non ha importanza perché la tua funzione non usa affatto lo value, ma una funzione di invio reale probabilmente farebbe effettivamente qualcosa con il valore, quindi devi passare il valore come argomento.