Spesso mi trovo a sovrascrivere i metodi di una classe padre e non posso mai decidere se elencare esplicitamente i parametri forniti o utilizzare solo un costrutto *args, **kwargs
. Una versione è migliore rispetto all'altra? Esiste una buona pratica? Quali (dis-) vantaggi mi mancano?Procedura consigliata per l'ereditarietà: * args, ** kwargs o specificando esplicitamente i parametri
class Parent(object):
def save(self, commit=True):
# ...
class Explicit(Parent):
def save(self, commit=True):
super(Explicit, self).save(commit=commit)
# more logic
class Blanket(Parent):
def save(self, *args, **kwargs):
super(Blanket, self).save(*args, **kwargs)
# more logic
vantaggi percepiti variante esplicito
- più esplicito (Zen di Python)
- facile da afferrare
- parametri funzionali facilmente accessibili
vantaggi percepiti coperta varia nt
- più DRY
- classe genitore è facilmente intercambiabile
- cambiamento dei valori standard di metodo padre si propaga senza toccare altro codice
Gran parte dipende esattamente da ciò che si sta sottoclasse ...Se c'è un'alta probabilità che tu aggiunga (o qualcun altro lo farà) kwarg aggiuntivi ai metodi della classe base, ha molto senso attenersi a '** kwargs'. Se questo non è probabile, la specificazione esplicita di kwargs è decisamente migliore da un punto di vista della leggibilità. –
Beh, stai sicuramente buttando via le informazioni. * L'esplicito è meglio di implicito * e tutto il resto. – kojiro
Avete due scelte: 1) nominare esplicitamente i parametri e * proibire * le modifiche alle firme nelle classi derivate (altrimenti goodluck con 'super' e l'ereditarietà multipla), o 2) Usare' ** kwargs' e consentire di cambiare la firma dei metodi . Quale dovrebbe essere usato probabilmente dipende dalla situazione. – Bakuriu