Concetti Chiave
- Gli attributi privati in Python iniziano con doppio underscore (__), rendendoli invisibili al di fuori della classe e nelle sottoclassi.
- Gli attributi protetti, contraddistinti da un singolo underscore (_), sono accessibili all'interno della classe e delle sue sottoclassi, ma non pubblicamente.
- La sottoclasse eredita tutte le operazioni della superclasse, garantendo che ogni metodo della superclasse sia valido anche nella sottoclasse.
- Il metodo super() consente di accedere e utilizzare i metodi della superclasse all'interno della sottoclasse, permettendo il "method overriding".
- La terminologia di ereditarietà include concetti come classe base, sottoclasse e la relazione di derivazione tra classi.
Attributi privati
Attributi privati e protetti
Attributi private: iniziano con __, non finiscono con __, cioè --nome
Sono privati alla classe di definizione, non è visibile fuori dalla classe e neppure nelle sottoclassi
Attributi protetti
Attributi protetti: di fatto si comportano come attributi e metodi pubblici ma vengono usati per chiarire il ruolo di alcuni nomi definiti nella classe
Attributi e metodi protetti possono essere modificati all'interno della classe | o delle sottoclassi | che li definiscono.
Per definire ed accedere ad attributi e metodi protetti anteponiamo un singolo underscore (_) al loro nome.
Sottoclassi – ereditarietà
Ereditarietà e sottoclassi
Ogni operazione della superclasse ha senso anche sulla sottoclasse
Class point:
Class movpoint(point):
Terminologia equivalente:
Movpoint è sottoclasse di point
Point è la superclasse (immediata) di point
Anche: movpoint è basata su point, è derivata da point
Point è la classe base di movpoint
Instanceof(object,class)
Quando si eredita un metodo, si può ridefinirlo (override)
Metodo super():super() restituisce l'oggetto (l'istanza) dove è chiamato, ma vista nella sua superclasse. È un "self" spostato nella sua superclasse
Class point:
def __init__(self,xx,yy):
self.x=xx
self.y=yy
Class colpoint(point):
def __init__(self,xx,yy,col):
super().__init__(xx,yy)
self.c=col
Dynamic method:
- lookup
- dispatch
Domande da interrogazione
- Qual è la differenza tra attributi privati e protetti in una classe?
- Come funziona l'ereditarietà tra classi in programmazione?
- Cosa fa il metodo super() in una sottoclasse?
Gli attributi privati, che iniziano con due underscore (__), non sono visibili al di fuori della classe in cui sono definiti, nemmeno nelle sottoclassi. Gli attributi protetti, invece, iniziano con un singolo underscore (_) e possono essere modificati all'interno della classe e delle sue sottoclassi, comportandosi come attributi pubblici per chiarire il loro ruolo.
L'ereditarietà consente a una sottoclasse di ereditare operazioni dalla sua superclasse. Ad esempio, se "movpoint" è una sottoclasse di "point", tutte le operazioni definite in "point" sono valide anche in "movpoint". Inoltre, i metodi ereditati possono essere ridefiniti (override) nella sottoclasse.
Il metodo super() restituisce l'oggetto dell'istanza nella sua superclasse, permettendo di accedere ai metodi e attributi definiti nella superclasse. Questo è utile per estendere o modificare il comportamento di un metodo ereditato.