logo

Paveldėjimas Python

Viena iš pagrindinių sąvokų Objektinis programavimas (OOP) kalbos yra paveldimos. Tai mechanizmas, leidžiantis sukurti klasių hierarchiją, kurios dalijasi savybių ir metodų rinkiniu, išvedant klasę iš kitos klasės. Paveldėjimas yra vienos klasės galimybė išvesti arba paveldėti savybes iš kitos klasės.

Paveldėjimo pranašumai yra šie:

Paveldėjimas leidžia paveldėti klasės savybes, t. y. bazinę klasę kitai, t. y. išvestinei klasei. „Python“ paveldėjimo pranašumai yra šie:



  • Tai gerai atspindi realaus pasaulio santykius.
  • Jis suteikia pakartotinio naudojimo iš kodo. Mums nereikia rašyti to paties kodo vėl ir vėl. Be to, tai leidžia mums pridėti daugiau funkcijų prie klasės jos nekeičiant.
  • Jis yra tranzityvus, o tai reiškia, kad jei B klasė paveldėtų iš kitos A klasės, tada visi B poklasiai automatiškai paveldėtų iš A klasės.
  • Paveldėjimas siūlo paprastą, suprantamą modelio struktūrą.
  • Mažiau plėtros ir priežiūros išlaidų atsiranda dėl paveldėjimo.

Python paveldėjimo sintaksė

Paprasto paveldėjimo sintaksė Python yra tokia:

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

Tėvų klasės kūrimas

Pirminė klasė yra klasė, kurios savybes paveldi antrinė klasė. Sukurkime tėvų klasę pavadinimu Asmuo kuri turi a Ekranas būdas parodyti informaciją apie asmenį.

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

>

mysql sąrašo vartotojai

>

Išvestis:

Satyam 102>

Vaiko klasės kūrimas

Antrinė klasė yra klasė, kuri valdo ypatybes iš pirminės klasės. čia Emp yra kita klasė, kuri paveldės savybes Asmuo klasė (bazinė klasė).

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

>

>

Išvestis:

Mayank 103 Emp class called>

„Python“ paveldėjimo pavyzdys

Pažiūrėkime paprasto Python paveldėjimo pavyzdį, kai antrinė klasė paveldi savo pirminės klasės savybes. Šiame pavyzdyje „Asmuo“ yra pagrindinė klasė, o „Darbuotojas“ yra antrinė klasė.

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

>

>

Išvestis:

Geek1 False Geek2 True>

Kas yra Python objektų klasė?

Kaip Java objektų klasė , Python (nuo 3 versijos. x) objektas yra visų klasių šaknis.

  • Python 3.x klasėje Test(objektas) ir klasė Testas yra vienodos.
  • Python 2. x klasė Test(object) sukuria klasę, kurioje objektas yra pirminis (vadinamas naujo stiliaus klase), o klasė Testas sukuria senojo tipo klasę (be prieštaraujančio pirminio).

Subklasė (iškviečiamas pirminės klasės konstruktorius)

Vaikų klasė turi nustatyti, kuri klasė yra jos pagrindinė klasė. Tai galima padaryti paminėjus pagrindinės klasės pavadinimą antrinės klasės apibrėžime.

Pavyzdys: klasės poklasio_pavadinimas (superclass_name)

Šiame pavyzdyje 'a' yra egzempliorius, sukurtas klasei Asmuo. Jis iškviečia nurodytos klasės __init__(). Klasės Asmens deklaracijoje galite pamatyti „objektą“. „Python“ programoje kiekviena klasė paveldi iš integruotos pagrindinės klasės, vadinamos „objektu“. Konstruktorius, ty klasės funkcija „__init__“, iškviečiamas, kai sukuriame objekto kintamąjį arba klasės egzempliorių.

Kintamieji, apibrėžti __init__(), vadinami egzempliorių kintamaisiais arba objektais. Vadinasi, „vardas“ ir „idnumber“ yra klasės Asmuo objektai. Panašiai „atlyginimas“ ir „paštas“ yra klasės „Darbuotojas“ objektai. Kadangi klasė Darbuotojas paveldi iš klasės Asmuo, „vardas“ ir „idnumber“ taip pat yra klasės „Darbuotojas“ objektai.

Python3


kirpimo įrankis ubuntu



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

>

>

Išvestis:

Rahul 886012>

„Python“ programa, skirta parodyti klaidą, jei pamirštame iškviesti pirminio __init__().

Jei pamiršite iškviesti pirminės klasės __init__(), tada jos egzempliorių kintamieji nebus pasiekiami antrinei klasei. Šis kodas sukelia klaidą dėl tos pačios priežasties.

Python3

js rinkinys




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

>

>

Išvestis:

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 yra integruota funkcija, kuri grąžina objektus, kurie atstovauja pagrindinei klasei. Tai leidžia pasiekti pirminės klasės metodus ir atributus antrinėje klasėje.

Pavyzdys: funkcija super() su paprastu Python paveldėjimu

Šiame pavyzdyje sukūrėme vaikų klasės objektą „obj“. Kai iškvietėme antrinės klasės konstruktorių „Studentas“, jis inicijavo duomenų narius į reikšmes, perduotas kuriant objektą. Tada naudodami funkciją super() iškvietėme pirminės klasės konstruktorių.

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

>

>

Išvestis:

java listnode
Rahul 23 Mayank 23>

Savybių pridėjimas

Viena iš paveldėjimo teikiamų savybių yra pirminės klasės savybių paveldėjimas, taip pat naujų savo savybių įtraukimas į antrinę klasę. Pažiūrėkime tai su pavyzdžiu:

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

>

>

Išvestis:

Čia matome, kad į vaikų klasę įtraukėme naują nuosavybę, t. y. gimimo datą (dob).

Rahul 23 Mayank 23 16-03-2000>

Įvairūs Python paveldėjimo tipai

Python yra 5 skirtingi paveldėjimo tipai. Jie yra tokie:

    Vienkartinis paveldėjimas: kai antrinė klasė paveldi tik iš vienos pirminės klasės, tai vadinama vienkartiniu paveldėjimu. Aukščiau matėme pavyzdį. Keli paveldėjimai : kai antrinė klasė paveldi iš kelių pirminių klasių, tai vadinama keliais paveldėjimais.

Skirtingai nuo Java, python rodo kelis paveldėjimus.

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

>

>

Išvestis:

Base1 Base2 Derived Geek1 Geek2>
    Daugiapakopis paveldėjimas: kai turime vaiko ir anūko ryšį. Tai reiškia, kad antrinė klasė paveldės iš pirminės klasės, kuri savo ruožtu paveldės iš pirminės klasės.

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

>

>

Išvestis:

Geek1 23 Noida>
    Hierarchinis paveldėjimas Iš vienos bazės gali būti sukurta daugiau nei viena išvestinė klasė. Hibridinis paveldėjimas: ši forma apjungia daugiau nei vieną paveldėjimo formą. Iš esmės tai yra daugiau nei vienos rūšies paveldėjimo mišinys.

Norėdami gauti daugiau informacijos, perskaitykite šį straipsnį: Paveldėjimo tipai Python

Privatūs tėvų klasės nariai

Ne visada norime, kad pirminės klasės egzempliorių kintamuosius paveldėtų antrinė klasė, t. y. kai kuriuos pirminės klasės egzempliorių kintamuosius galime padaryti privačiais, kurie nebus pasiekiami antrinei klasei.

„Python“ paveldėjimo sistemoje galime padaryti egzemplioriaus kintamąjį privatų, prieš jo pavadinimą pridėdami dvigubus pabraukimus. Pavyzdžiui:

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

>

nešiojamojo kompiuterio įdėjimo raktas
>

Išvestis:

Čia matome, kad kai bandėme atspausdinti kintamąjį „c“, jo reikšmė 21 atspausdinama konsolėje. Tuo tarpu kai bandėme spausdinti „d“, tai sukėlė klaidą. Taip yra todėl, kad kintamasis „d“ yra privatus naudojant apatinius brūkšnius. Ji nepasiekiama vaikų „D“ klasei, taigi ir klaida.

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