Ereditarietà Python (con esempi)

L'ereditarietà ci consente di definire una classe che prende tutte le funzionalità da una classe genitore e ci consente di aggiungerne altre. In questo tutorial imparerai a usare l'ereditarietà in Python.

Video: ereditarietà di Python

Eredità in Python

L'ereditarietà è una potente funzionalità nella programmazione orientata agli oggetti.

Si riferisce alla definizione di una nuova classe con poche o nessuna modifica a una classe esistente. La nuova classe è chiamata classe derivata (o figlia) e quella da cui eredita è chiamata classe base (o genitore) .

Sintassi dell'ereditarietà di Python

 class BaseClass: corpo della classe base class DerivedClass (BaseClass): corpo della classe derivata

La classe derivata eredita le funzionalità dalla classe di base dove possono essere aggiunte nuove funzionalità. Ciò si traduce in riutilizzabilità del codice.

Esempio di ereditarietà in Python

Per dimostrare l'uso dell'ereditarietà, facciamo un esempio.

Un poligono è una figura chiusa con 3 o più lati. Diciamo, abbiamo una classe chiamata Polygondefinita 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("Enter side "+str(i+1)+" : ")) for i in range(self.n)) def dispSides(self): for i in range(self.n): print("Side",i+1,"is",self.sides(i))

Questa classe dispone di attributi di dati per memorizzare il numero di lati ne l'ampiezza di ciascun lato come un elenco chiamato lati.

Il inputSides()metodo prende in considerazione l'ampiezza di ciascun lato e dispSides()visualizza queste lunghezze laterali.

Un triangolo è un poligono con 3 lati. Quindi, possiamo creare una classe chiamata Triangle che eredita da Polygon. Questo rende tutti gli attributi della classe Polygon disponibili per la classe Triangle.

Non è necessario definirli nuovamente (riusabilità del codice). Il triangolo può essere definito come segue.

 class Triangle(Polygon): def __init__(self): Polygon.__init__(self,3) def findArea(self): a, b, c = self.sides # calculate the semi-perimeter s = (a + b + c) / 2 area = (s*(s-a)*(s-b)*(s-c)) ** 0.5 print('The area of the triangle is %0.2f' %area)

Tuttavia, class Triangleha un nuovo metodo findArea()per trovare e stampare l'area del triangolo. Ecco un esempio di esecuzione.

 >>> t = Triangle() >>> t.inputSides() Enter side 1 : 3 Enter side 2 : 5 Enter side 3 : 4 >>> t.dispSides() Side 1 is 3.0 Side 2 is 5.0 Side 3 is 4.0 >>> t.findArea() The area of the triangle is 6.00

Possiamo vedere che anche se non abbiamo definito metodi come inputSides()o dispSides()per la classe Triangleseparatamente, siamo stati in grado di usarli.

Se un attributo non viene trovato nella classe stessa, la ricerca continua alla classe di base. Ciò si ripete in modo ricorsivo, se la classe base è essa stessa derivata da altre classi.

Sostituzione del metodo in Python

Nell'esempio sopra, si noti che il __init__()metodo è stato definito in entrambe le classi, Triangle e Polygon. Quando ciò accade, il metodo nella classe derivata sostituisce quello nella classe base. Questo per dire che __init__()in Triangle ha la preferenza rispetto __init__a Polygon.

Generalmente, quando si sovrascrive un metodo di base, si tende ad estendere la definizione piuttosto che semplicemente a sostituirla. Lo stesso viene fatto chiamando il metodo nella classe base da quello nella classe derivata (chiamando Polygon.__init__()da __init__()in Triangle).

Un'opzione migliore sarebbe utilizzare la funzione incorporata super(). Quindi, super().__init__(3)è equivalente a Polygon.__init__(self,3)ed è preferito. Per saperne di più sulla super()funzione in Python, visita la funzione super () di Python.

Due funzioni incorporate isinstance()e issubclass()vengono utilizzate per controllare le eredità.

La funzione isinstance()restituisce Truese l'oggetto è un'istanza della classe o di altre classi derivate da essa. Ogni classe in Python eredita dalla classe base object.

 >>> isinstance(t,Triangle) True >>> isinstance(t,Polygon) True >>> isinstance(t,int) False >>> isinstance(t,object) True

Allo stesso modo, issubclass()viene utilizzato per verificare l'ereditarietà delle classi.

 >>> issubclass(Polygon,Triangle) False >>> issubclass(Triangle,Polygon) True >>> issubclass(bool,int) True

Articoli interessanti...