logo

Arv i Python

Et af kernebegreberne i objektorienteret programmering (OOP) sprog er arv. Det er en mekanisme, der giver dig mulighed for at skabe et hierarki af klasser, der deler et sæt egenskaber og metoder ved at udlede en klasse fra en anden klasse. Arv er en klasses evne til at udlede eller arve egenskaberne fra en anden klasse.

Fordelene ved arv er:



Nedarvning giver dig mulighed for at arve egenskaberne for en klasse, dvs. basisklasse til en anden, dvs. afledt klasse. Fordelene ved arv i Python er som følger:

  • Det repræsenterer forhold i den virkelige verden godt.
  • Det giver genbrugelighed af en kode. Vi behøver ikke at skrive den samme kode igen og igen. Det giver os også mulighed for at tilføje flere funktioner til en klasse uden at ændre den.
  • Det er transitivt af natur, hvilket betyder, at hvis klasse B arver fra en anden klasse A, så vil alle underklasser af B automatisk arve fra klasse A.
  • Arv tilbyder en enkel, forståelig modelstruktur.
  • Færre udviklings- og vedligeholdelsesudgifter skyldes en arv.

Python arvesyntaks

Syntaksen for simpel arv i Python er som følger:

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

Oprettelse af en forældreklasse

En overordnet klasse er en klasse, hvis egenskaber er arvet af den underordnede klasse. Lad os oprette en forældreklasse kaldet Person som har en Skærm metode til at vise personens oplysninger.



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

>

>

Produktion:

Satyam 102>

Oprettelse af en børneklasse

En underklasse er en klasse, der driver egenskaberne fra sin overordnede klasse. Her Emp er en anden klasse, der kommer til at arve egenskaberne af Person klasse (basisklasse).

Python3

java fangst prøve




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

>

>

Produktion:

Mayank 103 Emp class called>

Eksempel på arv i Python

Lad os se et eksempel på simpel Python-arv, hvor en underordnet klasse arver egenskaberne fra sin overordnede klasse. I dette eksempel er 'Person' den overordnede klasse, og 'Medarbejder' er dens underordnede klasse.

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

>

>

Produktion:

Geek1 False Geek2 True>

Hvad er en objektklasse i Python?

Ligesom Java Object klasse , i Python (fra version 3. x), er objektet roden af ​​alle klasser.

  • I Python 3.x er klasse Test(objekt) og klassetest ens.
  • I Python 2. x opretter klassen Test(objekt) en klasse med objektet som forælder (kaldet en ny-stil-klasse), og klassen Test opretter en gammel-stil-klasse (uden en indsigelsesoverordnet).

Underklassificering (kaldende konstruktør af overordnet klasse)

En børneklasse skal identificere, hvilken klasse der er dens overordnede klasse. Dette kan gøres ved at nævne det overordnede klassenavn i definitionen af ​​den underordnede klasse.

datoformat.format java

Eksempel: klasse underklasse_navn (overklasse_navn)

I dette eksempel, 'en' er den instans, der er oprettet for klassen Person. Den kalder på __init__() for den refererede klasse. Du kan se 'genstand' skrevet i erklæringen fra klassen Person. I Python arver hver klasse fra en indbygget basisklasse kaldet 'objekt'. Konstruktøren, dvs. '__init__'-funktionen af ​​en klasse, påkaldes, når vi opretter en objektvariabel eller en forekomst af klassen.

Variablerne defineret i __init__() kaldes instansvariabler eller objekter. Derfor er 'navn' og 'idnummer' objekterne for klassen Person. Tilsvarende er 'løn' og 'stilling' objekterne for klassen Medarbejder. Da klassen Medarbejder arver fra klassen Person, er 'navn' og 'idnummer' også objekterne for klassens Medarbejder.

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

>

>

Produktion:

Rahul 886012>

Python-program til at demonstrere fejl, hvis vi glemmer at påberåbe __init__() af forælderen

Hvis du glemmer at kalde __init__() af den overordnede klasse, vil dens instansvariabler ikke være tilgængelige for den underordnede klasse. Følgende kode producerer en fejl af samme årsag.

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

>

>

Output:

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

Super()-funktionen

Det super() funktion er en indbygget funktion, der returnerer de objekter, der repræsenterer den overordnede klasse. Det giver adgang til forældreklassens metoder og attributter i underklassen.

Eksempel: super() funktion med simpel Python-arv

I dette eksempel har vi oprettet objektet 'obj' for børneklassen. Da vi kaldte konstruktøren af ​​børneklassen 'Student', initialiserede den datamedlemmerne til de værdier, der blev videregivet under objektoprettelsen. Så ved at bruge super()-funktionen, påkaldte vi konstruktøren af ​​den overordnede klasse.

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

>

>

Produktion:

periode nøgle
Rahul 23 Mayank 23>

Tilføjelse af egenskaber

En af de funktioner, som arv giver, er at nedarve egenskaberne fra den overordnede klasse samt tilføje nye egenskaber til den underordnede klasse. Lad os se dette med et eksempel:

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

>

>

Produktion:

Her kan vi se, at vi har tilføjet en ny ejendom til børneklassen, altså fødselsdato (dob).

Rahul 23 Mayank 23 16-03-2000>

Forskellige typer af Python-arv

Der er 5 forskellige typer af arv i Python. De er som følger:

    Enkeltarv : Når en barneklasse kun arver fra én forældreklasse, kaldes det enkeltarv. Vi så et eksempel ovenfor. Multiple arv : Når en børneklasse arver fra flere forældreklasser, kaldes det multiple arv.

I modsætning til Java viser python flere arv.

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

>

>

Produktion:

Base1 Base2 Derived Geek1 Geek2>
    Arv på flere niveauer: Når vi har et barn- og barnebarnsforhold. Det betyder, at en børneklasse vil arve fra sin overordnede klasse, som igen arver fra sin overordnede klasse.

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

>

>

java indeks

Produktion:

Geek1 23 Noida>
    Hierarkisk arv Mere end én afledt klasse kan oprettes fra en enkelt base. Hybrid arv : Denne form kombinerer mere end én form for arv. Grundlæggende er det en blanding af mere end én type arv.

For flere detaljer, læs venligst denne artikel: Typer af arv i Python

Private medlemmer af forældreklassen

Vi ønsker ikke altid, at forekomstvariablerne for den overordnede klasse skal nedarves af den underordnede klasse, dvs. vi kan gøre nogle af forekomstvariablerne for den overordnede klasse private, som ikke vil være tilgængelige for den underordnede klasse.

I Python-arv kan vi gøre en instansvariabel privat ved at tilføje dobbelte understregninger før dens navn. For eksempel:

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

>

>

Output:

Her kan vi se, at da vi forsøgte at udskrive variablen 'c', er dens værdi 21 udskrevet på konsollen. Mens vi forsøgte at udskrive 'd', genererede det fejlen. Dette skyldes, at variablen 'd' gøres privat ved at bruge understregningerne. Det er ikke tilgængeligt for børneklassen 'D' og dermed fejlen.

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