logo

Dziedziczenie w Pythonie

Jedna z podstawowych koncepcji w programowanie obiektowe (OOP) języki są dziedziczone. Jest to mechanizm umożliwiający utworzenie hierarchii klas mających wspólny zestaw właściwości i metod poprzez wyprowadzenie klasy z innej klasy. Dziedziczenie to zdolność jednej klasy do wyprowadzania lub dziedziczenia właściwości z innej klasy.

Korzyści z dziedziczenia to:

Dziedziczenie umożliwia dziedziczenie właściwości klasy, tj. klasy bazowej, innej, tj. klasy pochodnej. Korzyści z dziedziczenia w Pythonie są następujące:



  • Dobrze reprezentuje relacje w świecie rzeczywistym.
  • Zapewnia możliwość ponownego użycia kodu. Nie musimy ciągle pisać tego samego kodu. Pozwala nam także dodawać więcej funkcji do klasy bez jej modyfikowania.
  • Ma ona charakter przechodni, co oznacza, że ​​jeśli klasa B dziedziczy po innej klasie A, wówczas wszystkie podklasy B automatycznie dziedziczą po klasie A.
  • Dziedziczenie oferuje prostą, zrozumiałą strukturę modelu.
  • Mniejsze wydatki na rozwój i utrzymanie wynikają z dziedziczenia.

Składnia dziedziczenia w Pythonie

Składnia prostego dziedziczenia w Pythonie jest następująca:

Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}>

Tworzenie klasy nadrzędnej

Klasa nadrzędna to klasa, której właściwości są dziedziczone przez klasę podrzędną. Stwórzmy klasę nadrzędną o nazwie Osoba który ma Wyświetlacz metoda wyświetlania informacji o danej osobie.

Python3




# A Python program to demonstrate inheritance> class> Person(>object>):> > ># Constructor> >def> __init__(>self>, name,>id>):> >self>.name>=> name> >self>.>id> => id> ># To check if this person is an employee> >def> Display(>self>):> >print>(>self>.name,>self>.>id>)> # Driver code> emp>=> Person(>'Satyam'>,>102>)># An Object of Person> emp.Display()>

>

>

Wyjście:

Satyam 102>

Tworzenie klasy podrzędnej

Klasa podrzędna to klasa, która steruje właściwościami swojej klasy nadrzędnej. Tutaj Emp to kolejna klasa, która będzie dziedziczyć właściwości klasy Osoba klasa (klasa bazowa).

Python3




class> Emp(Person):> > >def> Print>(>self>):> >print>(>'Emp class called'>)> > Emp_details>=> Emp(>'Mayank'>,>103>)> # calling parent class function> Emp_details.Display()> # Calling child class function> Emp_details.>Print>()>

>

>

Wyjście:

Mayank 103 Emp class called>

Przykład dziedziczenia w Pythonie

Zobaczmy przykład prostego dziedziczenia w Pythonie, w którym klasa potomna dziedziczy właściwości swojej klasy nadrzędnej. W tym przykładzie „Osoba” jest klasą nadrzędną, a „Pracownik” jest jej klasą podrzędną.

Python3




# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Person(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> ># To check if this person is an employee> >def> isEmployee(>self>):> >return> False> # Inherited or Subclass (Note Person in bracket)> class> Employee(Person):> ># Here we return true> >def> isEmployee(>self>):> >return> True> # Driver code> emp>=> Person(>'Geek1'>)># An Object of Person> print>(emp.getName(), emp.isEmployee())> emp>=> Employee(>'Geek2'>)># An Object of Employee> print>(emp.getName(), emp.isEmployee())>

>

>

Wyjście:

Geek1 False Geek2 True>

Co to jest klasa obiektowa w Pythonie?

Jak Klasa obiektu Java , w Pythonie (od wersji 3.x) obiekt jest korzeniem wszystkich klas.

Linux zmień nazwę folderu
  • W Pythonie 3.x klasa Test(obiekt) i klasa Test są takie same.
  • W Pythonie 2. x klasa Test(object) tworzy klasę z obiektem jako rodzicem (nazywaną klasą w nowym stylu), a klasa Test tworzy klasę w starym stylu (bez sprzeciwiającego się rodzica).

Podklasa (wywołanie konstruktora klasy nadrzędnej)

Klasa potomna musi określić, która klasa jest jej klasą nadrzędną. Można tego dokonać poprzez podanie nazwy klasy nadrzędnej w definicji klasy podrzędnej.

Przykład: klasa nazwa_podklasy (nazwa_nadklasy)

W tym przykładzie 'A' jest instancją utworzoną dla klasy Person. Wywołuje funkcję __init__() klasy, o której mowa. Możesz zobaczyć „obiekt” zapisany w deklaracji klasy Person. W Pythonie każda klasa dziedziczy po wbudowanej klasie podstawowej zwanej „obiektem”. Konstruktor, czyli funkcja „__init__” klasy, jest wywoływany, gdy tworzymy zmienną obiektową lub instancję klasy.

Zmienne zdefiniowane w __init__() nazywane są zmiennymi instancji lub obiektami. Zatem „imię” i „numer identyfikacyjny” są obiektami klasy Osoba. Podobnie „wynagrodzenie” i „post” są obiektami klasy Pracownik. Ponieważ klasa Pracownik dziedziczy po klasie Osoba, „imię” i „numer identyfikacyjny” są także obiektami klasy Pracownik.

Python3




# Python code to demonstrate how parent constructors> # are called.> # parent class> class> Person(>object>):> ># __init__ is known as the constructor> >def> __init__(>self>, name, idnumber):> >self>.name>=> name> >self>.idnumber>=> idnumber> >def> display(>self>):> >print>(>self>.name)> >print>(>self>.idnumber)> # child class> class> Employee(Person):> >def> __init__(>self>, name, idnumber, salary, post):> >self>.salary>=> salary> >self>.post>=> post> ># invoking the __init__ of the parent class> >Person.__init__(>self>, name, idnumber)> # creation of an object variable or an instance> a>=> Employee(>'Rahul'>,>886012>,>200000>,>'Intern'>)> # calling a function of the class Person using its instance> a.display()>

>

>

Wyjście:

Rahul 886012>

Program w Pythonie pokazujący błąd, jeśli zapomnimy wywołać __init__() rodzica

Jeśli zapomnisz wywołać funkcję __init__() klasy nadrzędnej, wówczas zmienne jej instancji nie będą dostępne dla klasy podrzędnej. Poniższy kod generuje błąd z tego samego powodu.

Python3




class> A:> >def> __init__(>self>, n>=>'Rahul'>):> >self>.name>=> n> class> B(A):> >def> __init__(>self>, roll):> >self>.roll>=> roll> object> => B(>23>)> print>(>object>.name)>

>

>

Wyjście :

Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>

Funkcja super().

The funkcja super(). to wbudowana funkcja, która zwraca obiekty reprezentujące klasę nadrzędną. Umożliwia dostęp do metod i atrybutów klasy nadrzędnej w klasie podrzędnej.

Przykład: super() z prostym dziedziczeniem w języku Python

W tym przykładzie utworzyliśmy obiekt „obj” klasy potomnej. Kiedy wywołaliśmy konstruktora klasy potomnej „Student”, zainicjował on elementy danych wartościami przekazanymi podczas tworzenia obiektu. Następnie za pomocą funkcji super() wywołaliśmy konstruktor klasy nadrzędnej.

Python3




# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age):> >self>.sName>=> name> >self>.sAge>=> age> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge)> obj>=> Student(>'Mayank'>,>23>)> obj.display()> obj.displayInfo()>

>

>

Wyjście:

Rahul 23 Mayank 23>

Dodawanie właściwości

Jedną z funkcji dziedziczenia jest dziedziczenie właściwości klasy nadrzędnej, a także dodawanie nowych, własnych właściwości do klasy podrzędnej. Zobaczmy to na przykładzie:

Python3




# parent class> class> Person():> >def> __init__(>self>, name, age):> >self>.name>=> name> >self>.age>=> age> >def> display(>self>):> >print>(>self>.name,>self>.age)> # child class> class> Student(Person):> >def> __init__(>self>, name, age, dob):> >self>.sName>=> name> >self>.sAge>=> age> >self>.dob>=> dob> ># inheriting the properties of parent class> >super>().__init__(>'Rahul'>, age)> >def> displayInfo(>self>):> >print>(>self>.sName,>self>.sAge,>self>.dob)> obj>=> Student(>'Mayank'>,>23>,>'16-03-2000'>)> obj.display()> obj.displayInfo()>

>

>

Wyjście:

Tutaj widzimy, że do klasy podrzędnej dodaliśmy nową właściwość, czyli datę urodzenia (dob).

Rahul 23 Mayank 23 16-03-2000>

Różne typy dziedziczenia w Pythonie

W Pythonie istnieje 5 różnych typów dziedziczenia. Są one następujące:

    Dziedziczenie pojedyncze: Kiedy klasa potomna dziedziczy tylko od jednej klasy nadrzędnej, nazywa się to dziedziczeniem pojedynczym. Przykład widzieliśmy powyżej. Dziedziczenie wielokrotne: Kiedy klasa podrzędna dziedziczy z wielu klas nadrzędnych, nazywa się to dziedziczeniem wielokrotnym.

W przeciwieństwie do Javy, Python umożliwia wielokrotne dziedziczenie.

Python3

jaki jest rozmiar ekranu mojego komputera




# Python example to show the working of multiple> # inheritance> class> Base1(>object>):> >def> __init__(>self>):> >self>.str1>=> 'Geek1'> >print>(>'Base1'>)> class> Base2(>object>):> >def> __init__(>self>):> >self>.str2>=> 'Geek2'> >print>(>'Base2'>)> class> Derived(Base1, Base2):> >def> __init__(>self>):> ># Calling constructors of Base1> ># and Base2 classes> >Base1.__init__(>self>)> >Base2.__init__(>self>)> >print>(>'Derived'>)> >def> printStrs(>self>):> >print>(>self>.str1,>self>.str2)> ob>=> Derived()> ob.printStrs()>

>

>

Wyjście:

Base1 Base2 Derived Geek1 Geek2>
    Dziedziczenie wielopoziomowe: Kiedy mamy relację dziecko-wnuczek. Oznacza to, że klasa potomna będzie dziedziczyć po swojej klasie nadrzędnej, która z kolei dziedziczy po swojej klasie nadrzędnej.

Python3




# A Python program to demonstrate inheritance> # Base or Super class. Note object in bracket.> # (Generally, object is made ancestor of all classes)> # In Python 3.x 'class Person' is> # equivalent to 'class Person(object)'> class> Base(>object>):> ># Constructor> >def> __init__(>self>, name):> >self>.name>=> name> ># To get name> >def> getName(>self>):> >return> self>.name> # Inherited or Sub class (Note Person in bracket)> class> Child(Base):> ># Constructor> >def> __init__(>self>, name, age):> >Base.__init__(>self>, name)> >self>.age>=> age> ># To get name> >def> getAge(>self>):> >return> self>.age> # Inherited or Sub class (Note Person in bracket)> class> GrandChild(Child):> ># Constructor> >def> __init__(>self>, name, age, address):> >Child.__init__(>self>, name, age)> >self>.address>=> address> ># To get address> >def> getAddress(>self>):> >return> self>.address> # Driver code> g>=> GrandChild(>'Geek1'>,>23>,>'Noida'>)> print>(g.getName(), g.getAge(), g.getAddress())>

>

>

Wyjście:

Geek1 23 Noida>
    Dziedziczenie hierarchiczne Z jednej bazy można utworzyć więcej niż jedną klasę pochodną. Dziedziczenie hybrydowe: Ta forma łączy w sobie więcej niż jedną formę dziedziczenia. Zasadniczo jest to połączenie więcej niż jednego rodzaju dziedziczenia.

Aby uzyskać więcej informacji, przeczytaj ten artykuł: Rodzaje dziedziczenia w Pythonie

Prywatni członkowie klasy nadrzędnej

Nie zawsze chcemy, aby zmienne instancji klasy nadrzędnej były dziedziczone przez klasę podrzędną, tzn. możemy ustawić niektóre zmienne instancji klasy nadrzędnej jako prywatne, co nie będzie dostępne dla klasy podrzędnej.

W dziedziczeniu w Pythonie możemy ustawić zmienną instancji jako prywatną, dodając podwójne podkreślenie przed jej nazwą. Na przykład:

Python3




# Python program to demonstrate private members> # of the parent class> class> C(>object>):> >def> __init__(>self>):> >self>.c>=> 21> ># d is private instance variable> >self>.__d>=> 42> class> D(C):> >def> __init__(>self>):> >self>.e>=> 84> >C.__init__(>self>)> object1>=> D()> # produces an error as d is private instance variable> print>(object1.c)> print>(object1.__d)>

>

>

Wyjście :

Tutaj widzimy, że gdy próbowaliśmy wydrukować zmienną „c”, na konsoli wypisana została jej wartość 21. Natomiast gdy próbowaliśmy wydrukować „d”, wygenerował błąd. Dzieje się tak, ponieważ zmienna „d” jest prywatna poprzez użycie podkreśleń. Nie jest dostępna dla klasy podrzędnej „D” i stąd błąd.

21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>