Mantojums Python valodā

Viens no galvenajiem jēdzieniem objektorientētā programmēšana (OOP) valodas ir mantošana. Tas ir mehānisms, kas ļauj izveidot klašu hierarhiju, kurām ir kopīgs īpašību un metožu kopums, atvasinot klasi no citas klases. Mantojums ir vienas klases spēja iegūt vai mantot īpašības no citas klases.

Mantojuma priekšrocības ir:

Mantojums ļauj mantot klases, t.i., bāzes klases, īpašības citai, t.i., atvasinātai klasei. Mantojuma priekšrocības Python ir šādas:

  • Tas labi atspoguļo reālās pasaules attiecības.
  • Tas nodrošina atkārtota izmantošana no koda. Mums nav jāraksta viens un tas pats kods atkal un atkal. Turklāt tas ļauj mums pievienot klasei vairāk funkciju, to nemainot.
  • Tam ir pārejošs raksturs, kas nozīmē, ka, ja B klase manto no citas A klases, tad visas B apakšklases automātiski mantotu no A klases.
  • Mantojums piedāvā vienkāršu, saprotamu modeļa struktūru.
  • Mazāki izstrādes un uzturēšanas izdevumi izriet no mantojuma.

Python mantojuma sintakse

Python vienkāršas mantošanas sintakse ir šāda:

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

Vecāku klases izveide

Vecākā klase ir klase, kuras īpašības manto pakārtotā klase. Izveidosim vecāku klasi ar nosaukumu Persona kurā ir a Displejs metode, kā parādīt personas informāciju.

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

Izvade:

Satyam 102 

Bērnu klases izveide

Pakārtotā klase ir klase, kas vada rekvizītus no savas vecākklases. Šeit Emp ir vēl viena klase, kas pārmantos īpašības Persona klase (bāzes klase).

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

Izvade:

Mayank 103 Emp class called 

Mantojuma piemērs Python

Apskatīsim vienkāršu Python mantojuma piemēru, kurā pakārtotā klase manto savas vecākklases īpašības. Šajā piemērā “Persona” ir vecākklase, bet “Darbinieks” ir tās pakārtotā klase.

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

Izvade:

Geek1 False Geek2 True 

Kas ir objektu klase Python?

Java objektu klase , Python (no versijas 3. x) objekts ir visu klašu sakne.

  • Programmā Python 3.x klase Test(object) un klase Test ir vienādas.
  • Programmā Python 2. x klase Test(object) izveido klasi ar objektu kā vecāku (ko sauc par jaunā stila klasi), un klase Test izveido vecā stila klasi (bez iebilduma vecāka).

Apakšklase (vecklases konstruktora izsaukšana)

Bērnu klasei ir jānosaka, kura klase ir tās vecākklase. To var izdarīt, bērnklases definīcijā minot vecākklases nosaukumu.

Piemērs: klases apakšklases_nosaukums (superclass_name)

Šajā piemērā 'a' ir instance, kas izveidota klasei Persona. Tas izsauc norādītās klases __init__(). Jūs varat redzēt ‘objektu’, kas ierakstīts klases Personas deklarācijā. Programmā Python katra klase manto no iebūvētās pamatklases, ko sauc par “objektu”. Konstruktors, t.i., klases funkcija “__init__”, tiek izsaukta, kad mēs izveidojam objekta mainīgo vai klases gadījumu.

Mainīgos, kas definēti __init__(), sauc par gadījumu mainīgajiem vai objektiem. Tādējādi “vārds” un “idnumber” ir klases Personas objekti. Tāpat “alga” un “amats” ir kategorijas Darbinieks objekti. Tā kā klase Darbinieks manto no klases Persona, ‘vārds’ un ‘idnumber’ ir arī klases Darbinieks objekti.

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

Izvade:

Rahul 886012 

Python programma, lai parādītu kļūdu, ja aizmirstam izsaukt vecāku __init__().

Ja aizmirstat izsaukt vecākklases __init__(), tās instances mainīgie nebūs pieejami pakārtotajai klasei. Tālāk norādītais kods rada kļūdu tā paša iemesla dēļ.

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

Izvade:

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

Super() funkcija

The super() funkcija ir iebūvēta funkcija, kas atgriež objektus, kas pārstāv vecāku klasi. Tas ļauj piekļūt vecākklases metodēm un atribūtiem bērnu klasē.

Piemērs: super() funkcija ar vienkāršu Python mantojumu

Šajā piemērā mēs izveidojām bērnu klases objektu “obj”. Kad mēs saucām bērnklases konstruktoru “Students”, tas inicializēja datu dalībniekus vērtībām, kas tika nodotas objekta izveides laikā. Pēc tam, izmantojot funkciju super(), mēs izsaucām vecāku klases konstruktoru.

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

Izvade:

Rahul 23 Mayank 23 

Rekvizītu pievienošana

Viena no funkcijām, ko nodrošina mantošana, ir vecāku klases īpašību pārmantošana, kā arī jaunu mūsu pašu rekvizītu pievienošana pakārtotajai klasei. Apskatīsim to ar piemēru:

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

Izvade:

Šeit redzams, ka bērnu klasei pievienojām jaunu rekvizītu, t.i., dzimšanas datumu (dob).

Rahul 23 Mayank 23 16-03-2000 

Dažādi Python mantojuma veidi

Python ir 5 dažādi mantojuma veidi. Tie ir šādi:

    Atsevišķs mantojums: ja bērnu klase manto tikai no vienas vecāku klases, to sauc par vienu mantojumu. Mēs redzējām piemēru iepriekš. Vairāki mantojumi : ja pakārtotā klase manto no vairākām vecāku klasēm, to sauc par vairākiem mantojumiem.

Atšķirībā no Java, python parāda vairākus mantojumus.

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

Izvade:

Base1 Base2 Derived Geek1 Geek2 
    Daudzlīmeņu mantošana: kad mums ir bērna un mazbērna attiecības. Tas nozīmē, ka pakārtotā klase mantos no savas vecākklases, kas savukārt manto no savas vecākklases.

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

Izvade:

Geek1 23 Noida 
    Hierarhiskā mantošana No vienas bāzes var izveidot vairāk nekā vienu atvasinātu klasi. Hibrīda mantošana: šī forma apvieno vairāk nekā vienu mantojuma veidu. Būtībā tas ir vairāku veidu mantojuma sajaukums.

Lai iegūtu sīkāku informāciju, lūdzu, izlasiet šo rakstu: Mantojuma veidi Python

Privātie vecāku klases dalībnieki

Mēs ne vienmēr vēlamies, lai vecākklases gadījumu mainīgos mantotu pakārtotā klase, t.i., mēs varam padarīt dažus vecākklases gadījumu mainīgos privātus, kas nebūs pieejami pakārtotajai klasei.

Python mantojumā mēs varam padarīt instances mainīgo privātu, pirms tā nosaukuma pievienojot dubultās pasvītras. Piemēram:

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

Izvade:

Šeit mēs redzam, ka, mēģinot izdrukāt mainīgo “c”, tā vērtība 21 tiek izdrukāta konsolē. Savukārt, kad mēģinājām izdrukāt “d”, tas radīja kļūdu. Tas ir tāpēc, ka mainīgais “d” tiek padarīts privāts, izmantojot pasvītrojumus. Tā nav pieejama bērnu klasei “D”, un līdz ar to ir kļūda.

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