Dědičnost v Pythonu

Jeden ze základních konceptů v objektově orientované programování (OOP) jazyků je dědičnost. Je to mechanismus, který vám umožňuje vytvořit hierarchii tříd, které sdílejí sadu vlastností a metod odvozením třídy z jiné třídy. Dědičnost je schopnost jedné třídy odvozovat nebo zdědit vlastnosti z jiné třídy.

Výhody dědičnosti jsou:

Dědičnost umožňuje dědit vlastnosti třídy, tj. základní třídy na jinou, tj. odvozenou třídu. Výhody dědičnosti v Pythonu jsou následující:

  • Dobře reprezentuje vztahy v reálném světě.
  • Poskytuje znovupoužitelnost kódu. Nemusíme psát stejný kód znovu a znovu. Také nám umožňuje přidávat další funkce do třídy, aniž bychom ji upravovali.
  • Má tranzitivní povahu, což znamená, že pokud třída B dědí z jiné třídy A, pak všechny podtřídy B automaticky zdědí z třídy A.
  • Dědičnost nabízí jednoduchou a srozumitelnou strukturu modelu.
  • Menší náklady na vývoj a údržbu vyplývají z dědictví.

Syntaxe dědičnosti Pythonu

Syntaxe jednoduché dědičnosti v Pythonu je následující:

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

Vytvoření rodičovské třídy

Nadřazená třída je třída, jejíž vlastnosti dědí podřízená třída. Vytvořme nadřazenou třídu s názvem Osoba který má a Zobrazit způsob zobrazení informací o osobě.

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

Výstup:

Satyam 102 

Vytvoření dětské třídy

Podřízená třída je třída, která řídí vlastnosti ze své nadřazené třídy. Tady Emp je další třída, která zdědí vlastnosti třídy Osoba třída (základní třída).

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

Výstup:

Mayank 103 Emp class called 

Příklad dědičnosti v Pythonu

Podívejme se na příklad jednoduchého dědění Pythonu, ve kterém podřízená třída dědí vlastnosti své rodičovské třídy. V tomto příkladu je ‚Osoba‘ nadřazená třída a ‚Zaměstnanec‘ je její podřízená třída.

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

Výstup:

Geek1 False Geek2 True 

Co je třída objektů v Pythonu?

Jako Třída Java Object , v Pythonu (od verze 3. x) je objekt kořenem všech tříd.

  • V Pythonu 3.x jsou třída Test(objekt) a třída Test stejné.
  • V Pythonu 2. x třída Test(object) vytvoří třídu s objektem jako rodičem (nazývaná třída nového stylu) a třída Test vytvoří třídu starého stylu (bez nadřazeného objektu).

Podtřída (volající konstruktor nadřazené třídy)

Podřízená třída musí určit, která třída je její nadřazenou třídou. To lze provést uvedením názvu nadřazené třídy v definici podřízené třídy.

Příklad: třída název_třídy (název_nadtřídy)

V tomto příkladu 'A' je instance vytvořená pro třídu Osoba. Vyvolá __init__() odkazované třídy. Můžete vidět „objekt“ napsaný v prohlášení třídy Osoba. V Pythonu každá třída dědí z vestavěné základní třídy zvané ‚objekt‘. Konstruktor, tj. funkce ‚__init__‘ třídy se vyvolá, když vytvoříme objektovou proměnnou nebo instanci třídy.

Proměnné definované v __init__() se nazývají proměnné instance nebo objekty. „Jméno“ a „IDčíslo“ jsou tedy objekty třídy Osoba. Podobně „plat“ a „pošta“ jsou předměty třídy Zaměstnanec. Protože třída Zaměstnanec dědí z třídy Osoba, ‚jméno‘ a ‚idčíslo‘ jsou také objekty třídy Zaměstnanec.

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

Výstup:

Rahul 886012 

Python program pro demonstraci chyby, pokud zapomeneme vyvolat __init__() rodiče

Pokud zapomenete vyvolat __init__() nadřazené třídy, její proměnné instance nebudou pro podřízenou třídu dostupné. Následující kód způsobí chybu ze stejného důvodu.

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

Výstup :

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

Funkce super().

The funkce super(). je vestavěná funkce, která vrací objekty, které představují nadřazenou třídu. Umožňuje přístup k metodám a atributům nadřazené třídy v podřízené třídě.

Příklad: funkce super() s jednoduchou dědičností Pythonu

V tomto příkladu jsme vytvořili objekt ‚obj‘ podřízené třídy. Když jsme zavolali konstruktor podřízené třídy ‚Student‘, inicializoval datové členy na hodnoty předané během vytváření objektu. Poté jsme pomocí funkce super() vyvolali konstruktor nadřazené třídy.

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

Výstup:

Rahul 23 Mayank 23 

Přidání vlastností

Jednou z funkcí, které dědění poskytuje, je dědění vlastností nadřazené třídy a také přidávání nových vlastních vlastností do podřízené třídy. Podívejme se na to na příkladu:

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

Výstup:

Zde vidíme, že jsme do třídy dítěte přidali novou vlastnost, tj. datum narození (nar.).

Rahul 23 Mayank 23 16-03-2000 

Různé typy dědičnosti Pythonu

V Pythonu existuje 5 různých typů dědičnosti. Jsou následující:

    Jediná dědičnost: Když podřízená třída dědí pouze od jedné rodičovské třídy, nazývá se to jediné dědění. Příklad jsme viděli výše. Vícenásobná dědičnost: Když podřízená třída dědí z více nadřazených tříd, nazývá se to vícenásobná dědičnost.

Na rozdíl od Javy python ukazuje vícenásobnou dědičnost.

Python3




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

Výstup:

Base1 Base2 Derived Geek1 Geek2 
    Víceúrovňová dědičnost: Když máme vztah mezi dítětem a vnoučetem. To znamená, že podřízená třída bude dědit od své nadřazené třídy, která zase dědí od své nadřazené třídy.

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

Výstup:

Geek1 23 Noida 
    Hierarchická dědičnost Z jednoho základu lze vytvořit více než jednu odvozenou třídu. Hybridní dědičnost: Tato forma kombinuje více než jednu formu dědičnosti. V zásadě se jedná o směs více než jednoho typu dědictví.

Pro více podrobností si přečtěte tento článek: Typy dědičnosti v Pythonu

Soukromí členové nadřazené třídy

Nechceme vždy, aby proměnné instance nadřazené třídy byly zděděny podřízenou třídou, tj. můžeme některé proměnné instance nadřazené třídy nastavit jako soukromé, které nebudou podřízené třídě dostupné.

V dědičnosti Pythonu můžeme proměnnou instance učinit soukromou přidáním dvojitého podtržítka před její název. Například:

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

Výstup :

Zde vidíme, že když jsme se pokusili vytisknout proměnnou ‚c‘, na konzoli se vytiskne její hodnota 21. Zatímco když jsme se pokusili vytisknout „d“, došlo k chybě. Je to proto, že proměnná „d“ je pomocí podtržítek soukromá. Není k dispozici pro podřízenou třídu „D“, a proto došlo k chybě.

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