L'ereditarietà è utile, ma puoi sbloccarne tutto il potenziale riutilizzando il codice delle classi base.

Punti chiave

  • La funzione super() di Python consente di chiamare metodi della superclasse da una sottoclasse, semplificando l'implementazione dell'ereditarietà e dell'override del metodo.
  • La funzione super() è strettamente correlata al Method Risoluzione Order (MRO) in Python, che determina l'ordine in cui le classi antenati vengono cercate per metodi o attributi.
  • Usare super() nei costruttori di classi è una pratica comune per inizializzare gli attributi comuni nella classe genitore e quelli più specifici nella classe figlia. Il mancato utilizzo di super() può portare a conseguenze indesiderate, come la mancanza di inizializzazioni degli attributi.

Una delle caratteristiche principali di Python è il suo paradigma OOP, che puoi utilizzare per modellare entità del mondo reale e le loro relazioni.

Quando lavori con le classi Python, utilizzerai spesso l'ereditarietà e sovrascriverai gli attributi o i metodi di una superclasse. Python fornisce a

instagram viewer
super() funzione che ti consente di chiamare i metodi della superclasse dalla sottoclasse.

Cos'è super() e perché ne hai bisogno?

Usando l'ereditarietà, puoi creare una nuova classe Python che eredita le funzionalità di una classe esistente. Puoi anche sovrascrivere i metodi della superclasse nella sottoclasse, fornendo implementazioni alternative. Tuttavia, potresti voler utilizzare la nuova funzionalità in aggiunta a quella vecchia, anziché al suo posto. In questo caso, super() è utile.

Puoi usare il super() funzione per accedere agli attributi della superclasse e invocare i metodi della superclasse. Super è essenziale per programmazione orientata agli oggetti perché semplifica l'implementazione dell'ereditarietà e dell'override del metodo.

Come funziona super()?

Internamente, super() è strettamente correlato a Ordine di risoluzione del metodo (MRO) in Python, determinato dall'algoritmo di linearizzazione C3.

Ecco come super() lavori:

  1. Determina la classe e l'istanza correnti: Quando chiami super() all'interno di un metodo di una sottoclasse, Python individua automaticamente la classe corrente (la classe contenente il metodo che ha chiamato super()) e l'istanza di quella classe (cioè, se stesso).
  2. Determinare la superclasse: super() accetta due argomenti, la classe corrente e l'istanza, che non è necessario passare esplicitamente. Utilizza queste informazioni per determinare la superclasse a cui delegare la chiamata al metodo. Lo fa esaminando la gerarchia delle classi e l'MRO.
  3. Invocare il metodo sulla Superclasse: Una volta determinata la superclasse, super() ti permette di chiamare i suoi metodi come se li chiamassi direttamente dalla sottoclasse. Ciò consente di estendere o sovrascrivere i metodi utilizzando ancora l'implementazione originale della superclasse.

Utilizzo di super() in un costruttore di classi

Utilizzando super() in un costruttore di classe è una pratica comune, poiché spesso vorrai inizializzare gli attributi comuni nella classe genitore e quelli più specifici nella classe figlia.

Per dimostrare ciò, definire una classe Python, Padre, che a Figlio la classe eredita da:

classFather:
def__init__(self, first_name, last_name):
self.first_name = first_name
self.last_name = last_name

classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
# Call the parent class constructor (Father)
super().__init__(first_name, last_name)

self.age = age
self.hobby = hobby

defget_info(self):
returnf"Son's Name: {self.first_name}{self.last_name}, \
Son's Age: {self.age}, Son's Hobby: {self.hobby}"

# Create an instance of the Son class
son = Son("Pius", "Effiong", 25, "Playing Guitar")

# Access attributes
print(son.get_info())

Dentro il Figlio costruttore, la chiamata a super().init() invoca il Padre costruttore della classe, passandolo nome di battesimo E cognome come parametri. Ciò garantisce che il Padre può ancora impostare correttamente gli attributi del nome, anche su a Figlio oggetto.

Se non chiami super() in un costruttore di classe, il costruttore della sua classe genitore non verrà eseguito. Ciò può portare a conseguenze indesiderate, come inizializzazioni di attributi mancanti o configurazione incompleta dello stato della classe genitore:

...
classSon(Father):
def__init__(self, first_name, last_name, age, hobby):
self.age = age
self.hobby = hobby
...

Se ora provi a chiamare il ottenere informazioni metodo, verrà generato un Errore attributo perché il self.nome_nome E self.cognome gli attributi non sono stati inizializzati.

Utilizzo di super() nei metodi di classe

Puoi usare super() in altri metodi, a parte i costruttori, esattamente allo stesso modo. Ciò ti consente di estendere o sovrascrivere il comportamento del metodo della superclasse.

classFather:
defspeak(self):
return"Hello from Father"

classSon(Father):
defspeak(self):
# Call the parent class's speak method using super()
parent_greeting = super().speak()
returnf"Hello from Son\n{parent_greeting}"

# Create an instance of the Son class
son = Son()

# Call the speak method of the Son class
son_greeting = son.speak()

print(son_greeting)

IL Figlio la classe eredita da Padre e ha il suo parlare metodo. IL parlare metodo del Figlio usi della classe super().parla() chiamare il parlare metodo del Padre classe. Ciò gli consente di includere il messaggio della classe genitore estendendolo con un messaggio specifico per la classe figlia.

Mancato utilizzo super() in un metodo che ne sovrascrive un altro significa che la funzionalità presente nel metodo della classe genitore non avrà effetto. Ciò si traduce in una sostituzione completa del comportamento del metodo, che può portare a un comportamento non previsto.

Comprensione dell'ordine di risoluzione del metodo

Method Risoluzione Order (MRO) è l'ordine in cui Python ricerca le classi antenati quando accedi a un metodo o a un attributo. MRO aiuta Python a determinare quale metodo chiamare quando esistono più gerarchie di ereditarietà.

classNigeria():
defculture(self):
print("Nigeria's culture")

classAfrica():
defculture(self):
print("Africa's culture")

Ecco cosa succede quando crei un'istanza di Lagos lezione e chiama il cultura metodo:

  1. Python inizia cercando il file cultura metodo nel Lagos classe stessa. Se lo trova, chiama il metodo. In caso contrario, si passa alla fase due.
  2. Se non trova il cultura metodo nel Lagos class, Python esamina le classi base nell'ordine in cui appaiono nella definizione della classe. In questo caso, Lagos eredita prima da Africa e poi da Nigeria. Quindi, Python cercherà il file cultura metodo dentro Africa Primo.
  3. Se non trova il cultura metodo nel Africa class, Python cercherà quindi nel file Nigeria classe. Questo comportamento continua finché non raggiunge la fine della gerarchia e genera un errore se non riesce a trovare il metodo in nessuna delle superclassi.

L'output mostra l'ordine di risoluzione del metodo di Lagos, partendo da sinistra verso destra.

Insidie ​​​​comuni e migliori pratiche

Quando si lavora con super(), ci sono alcune trappole comuni da evitare.

  1. Tenere presente l'ordine di risoluzione del metodo, soprattutto in scenari di ereditarietà multipla. Se è necessario utilizzare l'ereditarietà multipla complessa, è necessario avere familiarità con Algoritmo di linearizzazione C3 che Python utilizza per determinare MRO.
  2. Evita le dipendenze circolari nella gerarchia delle classi, che possono portare a comportamenti imprevedibili.
  3. Documenta il tuo codice in modo chiaro, soprattutto quando si utilizza super() in gerarchie di classi complesse, per renderlo più comprensibile per gli altri sviluppatori.

Usa super() nel modo giusto

Di Pitone super() La funzione è una funzionalità potente quando si lavora con l'ereditarietà e l'override del metodo. Capire come super() funziona e seguire le migliori pratiche ti consentirà di creare codice più gestibile ed efficiente nei tuoi progetti Python.