Eden od temeljnih konceptov v objektno orientirano programiranje (OOP) jezikov je dedovanje. Je mehanizem, ki vam omogoča, da ustvarite hierarhijo razredov, ki si delijo nabor lastnosti in metod, tako da razred izpeljete iz drugega razreda. Dedovanje je zmožnost enega razreda, da izpelje ali podeduje lastnosti drugega razreda.
Prednosti dedovanja so:
Dedovanje vam omogoča, da podedujete lastnosti razreda, tj. osnovnega razreda, drugemu, tj. izpeljanemu razredu. Prednosti dedovanja v Pythonu so naslednje:
- Dobro predstavlja odnose v resničnem svetu.
- Zagotavlja ponovno uporabnost kode. Ni nam treba znova in znova pisati iste kode. Prav tako nam omogoča, da razredu dodamo več funkcij, ne da bi ga spreminjali.
- Po naravi je prehoden, kar pomeni, da če razred B podeduje od drugega razreda A, potem vsi podrazredi B samodejno podedujejo razred A.
- Dedovanje ponuja preprosto in razumljivo strukturo modela.
- Manj stroškov razvoja in vzdrževanja je posledica dedovanja.
Sintaksa dedovanja Python
Sintaksa preprostega dedovanja v Pythonu je naslednja:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}>
Ustvarjanje nadrejenega razreda
Nadrejeni razred je razred, katerega lastnosti podeduje podrejeni razred. Ustvarimo nadrejeni razred, imenovan Oseba ki ima a Zaslon način za prikaz podatkov o osebi.
Python3
številke abecede
# 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()> |
>
>
Izhod:
Satyam 102>
Ustvarjanje podrejenega razreda
Podrejeni razred je razred, ki poganja lastnosti svojega nadrejenega razreda. Tukaj Emp je še en razred, ki bo podedoval lastnosti Oseba razred (osnovni razred).
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> ()> |
>
>
Izhod:
Mayank 103 Emp class called>
Primer dedovanja v Pythonu
Oglejmo si primer preprostega dedovanja Python, v katerem podrejeni razred podeduje lastnosti svojega nadrejenega razreda. V tem primeru je 'Person' nadrejeni razred, 'Employee' pa njegov podrejeni razred.
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())> |
>
>
Izhod:
Geek1 False Geek2 True>
Kaj je objektni razred v Pythonu?
Kot Objektni razred Java , v Pythonu (od različice 3. x) je objekt koren vseh razredov.
- V Python 3.x sta razreda Test(object) in razred Test enaka.
- V Python 2. x razred Test(object) ustvari razred z nadrejenim predmetom (imenovan razred novega sloga), razred Test pa ustvari razred starega sloga (brez nadrejenega elementa, ki ugovarja).
Podrazred (Klicanje konstruktorja nadrejenega razreda)
Podrejeni razred mora identificirati, kateri razred je njegov nadrejeni razred. To lahko storite tako, da v definiciji podrejenega razreda omenite ime nadrejenega razreda.
primer: ime_podrazreda razreda (ime_nadrazreda)
V tem primeru 'a' je primerek, ustvarjen za razred Oseba. Prikliče __init__() navedenega razreda. V deklaraciji razreda Oseba lahko vidite zapisano 'objekt'. V Pythonu vsak razred deduje od vgrajenega osnovnega razreda, imenovanega 'objekt'. Konstruktor, tj. funkcija '__init__' razreda, se prikliče, ko ustvarimo objektno spremenljivko ali primerek razreda.
Spremenljivke, definirane znotraj __init__(), se imenujejo spremenljivke primerkov ali objekti. Zato sta 'ime' in 'idnumber' objekta razreda Oseba. Podobno sta 'plača' in 'delovno mesto' objekta razreda Employee. Ker razred Employee deduje od razreda Person, sta tudi 'ime' in 'idnumber' objekta razreda Employee.
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()> |
>
>
Izhod:
Rahul 886012>
Program Python za prikaz napake, če pozabimo priklicati __init__() nadrejenega
Če pozabite poklicati __init__() nadrejenega razreda, njegove spremenljivke primerka ne bodo na voljo podrejenemu razredu. Naslednja koda ustvari napako iz istega razloga.
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)> |
>
>
Izhod:
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>
Funkcija super().
The funkcija super(). je vgrajena funkcija, ki vrne objekte, ki predstavljajo nadrejeni razred. Omogoča dostop do metod in atributov nadrejenega razreda v podrejenem razredu.
primer: funkcija super() s preprostim dedovanjem Python
V tem primeru smo ustvarili objekt 'obj' podrejenega razreda. Ko smo konstruktorja podrejenega razreda poklicali 'Student', je inicializiral podatkovne člane na vrednosti, posredovane med ustvarjanjem objekta. Nato smo s funkcijo super() priklicali konstruktor nadrejenega razreda.
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()> |
>
>
Izhod:
Rahul 23 Mayank 23>
Dodajanje lastnosti
Ena od funkcij, ki jih nudi dedovanje, je dedovanje lastnosti nadrejenega razreda in dodajanje lastnih novih lastnosti podrejenemu razredu. Poglejmo to na primeru:
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()> |
>
>
Izhod:
Tukaj lahko vidimo, da smo podrejenemu razredu dodali novo lastnost, to je datum rojstva (dob).
Rahul 23 Mayank 23 16-03-2000>
Različne vrste dedovanja Python
V Pythonu obstaja 5 različnih vrst dedovanja. So naslednji:
- Enojno dedovanje: Ko podrejeni razred podeduje samo en nadrejeni razred, se to imenuje enojno dedovanje. Zgoraj smo videli primer. Večkratno dedovanje : Ko podrejeni razred deduje več nadrejenih razredov, se to imenuje večkratno dedovanje.
Za razliko od Jave, python prikazuje več dedovanja.
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()> |
>
>
Izhod:
Base1 Base2 Derived Geek1 Geek2>
- Večnivojsko dedovanje : Ko imamo odnos otrok in vnuk. To pomeni, da bo podrejeni razred dedoval od svojega nadrejenega razreda, ta pa deduje od svojega nadrejenega razreda.
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())> |
>
>
Izhod:
Geek1 23 Noida>
- Hierarhično dedovanje Iz ene same baze je mogoče ustvariti več kot en izpeljani razred. Hibridno dedovanje : Ta oblika združuje več kot eno obliko dedovanja. V bistvu gre za mešanico več kot ene vrste dedovanja.
Za več podrobnosti preberite ta članek: Vrste dedovanja v Pythonu
Zasebni člani nadrejenega razreda
Ne želimo vedno, da spremenljivke primerka nadrejenega razreda podeduje podrejeni razred, tj. nekatere spremenljivke primerka nadrejenega razreda lahko naredimo kot zasebne, kar ne bo na voljo podrejenemu razredu.
Pri dedovanju Pythona lahko spremenljivko primerka naredimo zasebno tako, da pred njeno ime dodamo dvojne podčrtaje. Na primer:
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)> |
>
>
Izhod:
Tukaj lahko vidimo, da ko smo poskušali natisniti spremenljivko 'c', je njena vrednost 21 natisnjena na konzoli. Ko smo poskušali natisniti 'd', je nastala napaka. To je zato, ker je spremenljivka 'd' zasebna z uporabo podčrtajev. Ni na voljo podrejenemu razredu „D“ in od tod napaka.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>