English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
L'ereditarietà ci permette di definire una classe che eredita tutte le funzionalità della classe padre e ci permette di aggiungere più funzionalità. In questo articolo, imparerai a utilizzare l'ereditarietà in Python.
L'ereditarietà è una funzione potente dell'orientamento agli oggetti.
Si riferisce a definire una nuovaClasse, che non modifica o modifica pochissimo la classe esistente. La nuova classe si chiamaClasse derivata (o figlia), e la nuova classe che ne eredita si chiamaClasse base (o genitore).
class BaseClass: #Corpo della classe base class DerivedClass(BaseClass): #Corpo della classe derivata
Le classi derivate ereditano gli elementi dalla classe base e ne aggiungono di nuovi. Questo può migliorare la riutilizzabilità del codice.
Per dimostrare l'uso dell'ereditarietà, prendiamo un esempio.
Un poligono è un grafico chiuso con 3 o più lati. Diciamo che abbiamo una classe chiamata Polygon definita come segue.
class Polygon: def __init__(self, no_of_sides): self.n = no_of_sides self.sides = [0 for i in range(no_of_sides)] def inputSides(self): self.sides = [float(input('Inserisci il lato ' + str(i+1) + ' : ')) for i in range(self.n)] def dispSides(self): for i in range(self.n): print('Lato', i+1, 'è', self.sides[i])
Questa classe ha attributi dati, utilizzati per memorizzare il numero di lati, i latiIl numeroe le dimensioni di ogni lato come elenco, ossiaIl numero di lati.
Il metodo inputSides() prende le dimensioni di ogni lato, allo stesso modo, dispSides() le visualizza correttamente.
Il triangolo è un poligono con 3 lati. Pertanto, possiamo creare una classe denominata Triangle che eredita da Polygon. Questo permette di utilizzare tutte le proprietà disponibili nella classe Polygon all'interno di Triangle senza doverle definire di nuovo (riutilizzo del codice). La definizione di Triangle è la seguente.
class Triangle(Polygon): def __init__(self): Polygon.__init__(self, 3) def findArea(self): a, b, c = self.sides # Calcolo della semiperimetro s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('L'area del triangolo è %0.2f' % area)
Ma, la classe Triangle ha un nuovo metodo findArea() per trovare e stampare l'area del triangolo. Ecco un esempio di esecuzione.
>>> t = Triangle() >>> t.inputSides() Inserisci il lato 1: 3 Inserisci il lato 2: 5 Inserisci il lato 3: 4 >>> t.dispSides() Il lato 1 è 3.0 Il lato 2 è 5.0 Il lato 3 è 4.0 >>> t.findArea() L'area del triangolo è 6.00
Possiamo vedere che, anche se non abbiamo definito metodi come inputSides() o sides() per la classe Triangle, possiamo utilizzarli.
Se non si trova l'attributo nella classe, la ricerca continua fino alla classe base. Se la classe base stessa è derivata da un'altra classe, questa operazione viene ripetuta ricorsivamente.]}
Nell'esempio sopra, nota che entrambi i classi Triangle e Polygon definiscono il metodo __init__(). Quando questo accade, il metodo della classe derivata sovrascrive il metodo della classe base. Questo significa che __init__() di Triangle ha la precedenza su __init__() di Polygon.
Di solito, quando si sovrascrive un metodo di base, tendiamo a estendere la definizione invece di sostituirlo semplicemente. Si completa la stessa operazione chiamando il metodo della classe base dalla classe derivata (chiamando Polygon.__init__() da __init__() di Triangle).
Una scelta migliore è utilizzare la funzione integrata super(). Pertanto, super().__init__(3) è equivalente a Polygon.__init__(self, 3) ed è la scelta preferita. Puoi sapere di più suin Pythonfunzione super()Più informazioni.
Due funzioni integrate, isinstance() e issubclass(), vengono utilizzate per verificare l'ereditarietà. Se l'oggetto è un esempio della classe o di un'altra classe derivata da essa, la funzione isinstance() restituisce True. Ogni classe in Python deriva dalla classe base object.
>>> isinstance(t, Triangle) Vero >>> isinstance(t, Polygon) Vero >>> isinstance(t, int) Falso >>> isinstance(t, object) Vero
Allo stesso modo, issubclass() viene utilizzato per verificare l'ereditarietà delle classi.
>>> issubclass(Polygon, Triangle) Falso >>> issubclass(Triangle, Polygon) Vero >>> issubclass(bool, int) Vero