Dziedziczenie w Pythonie (z przykładami)

Dziedziczenie umożliwia nam zdefiniowanie klasy, która przejmuje całą funkcjonalność z klasy nadrzędnej i pozwala nam dodawać kolejne. W tym samouczku nauczysz się korzystać z dziedziczenia w Pythonie.

Wideo: dziedziczenie w języku Python

Dziedziczenie w Pythonie

Dziedziczenie to potężna funkcja w programowaniu obiektowym.

Odnosi się do definiowania nowej klasy z niewielkimi modyfikacjami lub bez modyfikacji istniejącej klasy. Nowa klasa jest nazywana klasą pochodną (lub podrzędną), a ta, z której dziedziczy, nazywana jest klasą podstawową (lub nadrzędną) .

Składnia dziedziczenia w Pythonie

 class BaseClass: Treść klasy bazowej. DerivedClass (BaseClass): Treść klasy pochodnej

Klasa pochodna dziedziczy funkcje z klasy bazowej, do której można dodawać nowe funkcje. Powoduje to ponowne użycie kodu.

Przykład dziedziczenia w Pythonie

Aby zademonstrować zastosowanie dziedziczenia, weźmy przykład.

Wielokąt to zamknięta figura z 3 lub więcej bokami. Powiedzmy, że mamy klasę o nazwie Polygonzdefiniowaną w następujący sposób.

 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))

Ta klasa ma atrybuty danych do przechowywania liczby boków n i wielkości każdego boku w postaci listy nazywanej bokami.

inputSides()Metoda trwa w wielkości każdej strony i dispSides()wyświetla te długości boków.

Trójkąt to wielokąt o trzech bokach. Więc możemy stworzyć klasę o nazwie Triangle, która dziedziczy po Polygon. Dzięki temu wszystkie atrybuty klasy Polygon stają się dostępne dla klasy Triangle.

Nie musimy ich ponownie definiować (możliwość ponownego wykorzystania kodu). Trójkąt można zdefiniować w następujący sposób.

 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)

Jednak klasa Trianglema nową metodę findArea()znajdowania i drukowania obszaru trójkąta. Oto przykładowy przebieg.

 >>> 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

Widzimy, że chociaż nie zdefiniowaliśmy osobno metod takich jak inputSides()lub dispSides()dla klasy Triangle, mogliśmy ich używać.

Jeśli atrybut nie zostanie znaleziony w samej klasie, wyszukiwanie jest kontynuowane w klasie bazowej. To powtarza się rekurencyjnie, jeśli sama klasa bazowa pochodzi od innych klas.

Zastąpienie metody w Pythonie

W powyższym przykładzie zwróć uwagę, że __init__()metoda została zdefiniowana w obu klasach, Triangle oraz Polygon. W takim przypadku metoda w klasie pochodnej zastępuje metodę w klasie bazowej. Oznacza to, że __init__()w Trójkącie ma pierwszeństwo przed __init__w Poligonie.

Ogólnie rzecz biorąc, zastępując metodę podstawową, staramy się rozszerzać definicję, zamiast ją zastępować. To samo dzieje się poprzez wywołanie metody w klasie bazowej z klasy pochodnej (wywołanie Polygon.__init__()z __init__()in Triangle).

Lepszym rozwiązaniem byłoby użycie funkcji wbudowanej super(). Tak więc super().__init__(3)jest równoważne Polygon.__init__(self,3)i jest preferowane. Aby dowiedzieć się więcej o super()funkcji w Pythonie, odwiedź stronę Python super () function.

Dwie wbudowane funkcje isinstance()i issubclass()służą do sprawdzania dziedziczenia.

Funkcja isinstance()zwraca, Truejeśli obiekt jest instancją klasy lub innych klas pochodnych. Każda klasa w Pythonie dziedziczy po klasie bazowej object.

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

Podobnie issubclass()służy do sprawdzania dziedziczenia klas.

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

Interesujące artykuły...