La funzione di costruzione della superclasse in una sottoclasse è davvero importante?

3

Il seguente pezzo di codice Python utilizza una superclasse esclusivamente come repository di funzioni che una o più sottoclassi possono trarre da:

class Class(object):
    ''' A trivial repository for functions to be inherited '''

    def function(self):
        print self

class Subclass(Class):
    ''' A subclass where the action is'''

    def __init__(self):
        pass

subitem = Subclass()
subitem.function()

Questa sembra essere la quantità minima di codice adatta a tale scopo.

Tuttavia, ho ricevuto un suggerimento non argomentato sul fatto che un modo migliore per codificare lo stesso sarebbe avere un costruttore nella superclasse e chiamarlo all'interno del costruttore della sottoclasse (apparentemente una sorta di accoppiamento più stretto):

class Class(object):
    ''' The function repository, now featuring a constructor'''

    def __init__(self):
        pass

    def function(self):
        print self


class Subclass(Class):
    ''' The same subclass, but its constructor invokes the superclass constructor'''

    def __init__(self):
        Class.__init__(self)

subitem = Subclass()
subitem.function()

La domanda è ... In che modo il secondo modo di sottoclasse sarebbe "superiore" al primo? Superiore potrebbe significare più generale, applicabile a una maggiore varietà di situazioni e così via.

Grazie per averci pensato.

    
posta XavierStuvw 11.05.2016 - 15:23
fonte

1 risposta

11

Se aggiungi le variabili a self nel costruttore di Class e non chiami Class.__init__() nel costruttore di Subclass , queste variabili non saranno nel tuo oggetto Subclass .

Vedi la domanda per un esempio.

Nel tuo caso, Class è semplicemente un repository di funzioni. Quindi, non farà la differenza. Tuttavia, in futuro, potrebbe essere necessario aggiungere alcune variabili in modo che le funzioni di quella classe funzionino insieme. L'utilizzo di self può essere conveniente per questo scopo.

L'aggiunta di Class.__init__() ora potrebbe quindi risparmiare tempo se scegli di utilizzare self in seguito. In effetti, potrebbe essere necessario molto tempo per capire che hai dimenticato quella riga nel costruttore Subclass .

    
risposta data 11.05.2016 - 16:12
fonte

Leggi altre domande sui tag