Yksi keskeisistä käsitteistä olio-ohjelmointi (OOP) kielet ovat periytyviä. Se on mekanismi, jonka avulla voit luoda hierarkian luokista, jotka jakavat joukon ominaisuuksia ja menetelmiä johtamalla luokan toisesta luokasta. Periytys tarkoittaa yhden luokan kykyä johtaa tai periä ominaisuuksia toisesta luokasta.
Perinnön edut ovat:
Periytys mahdollistaa luokan, eli perusluokan, ominaisuuksien perimisen toiselle eli johdetulle luokalle. Pythonin perinnön edut ovat seuraavat:
- Se edustaa hyvin todellisia ihmissuhteita.
- Se tarjoaa uudelleenkäytettävyyttä koodista. Meidän ei tarvitse kirjoittaa samaa koodia uudestaan ja uudestaan. Sen avulla voimme myös lisätä ominaisuuksia luokkaan muuttamatta sitä.
- Se on luonteeltaan transitiivinen, mikä tarkoittaa, että jos luokka B perii toiselta luokalta A, kaikki B:n alaluokat perivät automaattisesti luokasta A.
- Inheritance tarjoaa yksinkertaisen, ymmärrettävän mallirakenteen.
- Vähemmän kehitys- ja ylläpitokuluja syntyy perinnöstä.
Python-perinnön syntaksi
Pythonin yksinkertaisen periytymisen syntaksi on seuraava:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}> Vanhempainluokan luominen
Pääluokka on luokka, jonka ominaisuudet perii alaluokka. Luodaan vanhempiluokka nimeltä Henkilö jossa on a Näyttö tapa näyttää henkilön tiedot.
Python 3
# 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()> |
>
>
Lähtö:
Satyam 102>
Lapsiluokan luominen
Lapsiluokka on luokka, joka ohjaa ominaisuudet yläluokkastaan. Tässä Emp on toinen luokka, joka aikoo periä ominaisuudet Henkilö luokka (perusluokka).
Python 3
java vertailukelpoinen
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>()> |
>
>
Lähtö:
Mayank 103 Emp class called>
Esimerkki perinnöstä Pythonissa
Katsotaanpa esimerkkiä yksinkertaisesta Python-perinnöstä, jossa aliluokka perii yläluokkansa ominaisuuksia. Tässä esimerkissä 'Henkilö' on pääluokka ja 'Työntekijä' on sen alaluokka.
Python 3
# 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())> |
>
>
Lähtö:
Geek1 False Geek2 True>
Mikä on Pythonin objektiluokka?
Kuin Java-objektiluokka Pythonissa (versiosta 3. x alkaen) objekti on kaikkien luokkien juuri.
- Python 3.x:ssä luokka Test(object) ja luokka Test ovat samat.
- Python 2. x:ssä luokka Test(object) luo luokan, jossa objekti on ylätasona (kutsutaan uuden tyylin luokkaksi), ja luokka Test luo vanhan tyylin luokan (ilman vastustavaa yläluokkaa).
Alaluokka (emoluokan kutsuva konstruktori)
Lapsiluokan tulee tunnistaa, mikä luokka on sen yläluokka. Tämä voidaan tehdä mainitsemalla yläluokan nimi aliluokan määritelmässä.
Esimerkki: luokan alaluokan_nimi (superclass_name)
Tässä esimerkissä 'a' on luokalle Henkilö luotu ilmentymä. Se kutsuu viitatun luokan __init__():n. Voit nähdä 'objektin' kirjoitettuna luokan Person-ilmoituksessa. Pythonissa jokainen luokka perii sisäänrakennetusta perusluokasta nimeltä 'objekti'. Luokan konstruktori eli '__init__'-funktio kutsutaan, kun luomme objektimuuttujan tai luokan esiintymän.
__init__():ssa määritettyjä muuttujia kutsutaan ilmentymämuuttujiksi tai objekteiksi. Tästä syystä 'nimi' ja 'tunnusnumero' ovat luokan Person objekteja. Samoin 'palkka' ja 'virka' ovat luokan Työntekijä kohteita. Koska luokka Työntekijä perii luokasta Person, 'nimi' ja 'idnumber' ovat myös luokan Työntekijä objekteja.
Python 3
dhanashree verma
# 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()> |
>
>
Lähtö:
Rahul 886012>
Python-ohjelma, joka osoittaa virheen, jos unohdamme kutsua vanhemman __init__().
Jos unohdat kutsua pääluokan __init__(), sen ilmentymämuuttujat eivät ole aliluokan käytettävissä. Seuraava koodi tuottaa virheen samasta syystä.
Python 3
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)> |
>
>
Lähtö:
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>
Super()-funktio
The super()-funktio on sisäänrakennettu funktio, joka palauttaa emoluokkaa edustavat objektit. Sen avulla pääset pääluokan menetelmiin ja attribuutteihin lapsiluokassa.
Esimerkki: super()-funktio yksinkertaisella Python-perinnöllä
Tässä esimerkissä loimme aliluokan objektin 'obj'. Kun kutsuimme aliluokan konstruktoria 'Student', se alustaa datajäsenet objektin luonnin aikana välitettyihin arvoihin. Sitten super()-funktion avulla kutsuimme emoluokan rakentajan.
Python 3
# 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()> |
>
>
Lähtö:
Rahul 23 Mayank 23>
Ominaisuuksien lisääminen
Yksi periytymisen tarjoamista ominaisuuksista on emoluokan ominaisuuksien periminen sekä omien uusien ominaisuuksien lisääminen aliluokkaan. Katsotaanpa tätä esimerkillä:
Python 3
kutsu javascript-funktio html:stä
# 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()> |
>
>
Lähtö:
Tästä näemme, että lisäsimme lapsiluokkaan uuden ominaisuuden, eli syntymäajan (dob).
Rahul 23 Mayank 23 16-03-2000>
Python-perinnön eri tyypit
Pythonissa on 5 erilaista perintötyyppiä. Ne ovat seuraavat:
- Yksittäinen periytyminen: Kun alaluokka perii vain yhdeltä vanhemmalta luokalta, sitä kutsutaan yksittäisperinnöksi. Näimme esimerkin yllä. Useita perintöjä : Kun aliluokka perii useilta pääluokilta, sitä kutsutaan useiksi periytyiksi.
Toisin kuin Java, python näyttää useita perintöjä.
Python 3
# 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()> |
>
>
Lähtö:
Base1 Base2 Derived Geek1 Geek2>
- Monitasoinen perintö: Kun meillä on lapsi- ja lapsenlapsisuhde. Tämä tarkoittaa, että aliluokka perii pääluokastaan, joka puolestaan periy yläluokltaan.
Python 3
# 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())> |
>
>
Lähtö:
Geek1 23 Noida>
- Hierarkkinen periytyminen Yhdestä kannasta voidaan luoda useampi kuin yksi johdettu luokka. Hybridiperintö: Tämä muoto yhdistää useamman kuin yhden periytymismuodon. Periaatteessa se on sekoitus useamman kuin yhden perinnön tyyppiä.
Saat lisätietoja lukemalla tämän artikkelin: Perinnön tyypit Pythonissa
Vanhemman luokan yksityiset jäsenet
Emme aina halua, että aliluokka perii yläluokan ilmentymämuuttujia, eli voimme tehdä joistakin yläluokan ilmentymämuuttujista yksityisiä, jotka eivät ole aliluokan käytettävissä.
Python-perinnössä voimme tehdä ilmentymän muuttujan yksityiseksi lisäämällä kaksinkertaiset alaviivat sen nimen eteen. Esimerkiksi:
Python 3
int merkkijonoon javassa
# 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)> |
>
>
Lähtö:
Tässä näemme, että kun yritimme tulostaa muuttujaa 'c', sen arvo 21 tulostetaan konsoliin. Kun taas yritimme tulostaa 'd', se loi virheen. Tämä johtuu siitä, että muuttuja 'd' tehdään yksityiseksi alaviivoja käyttämällä. Se ei ole saatavilla lapsiluokalle D ja siksi virhe.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>