logo

Arv i Python

Et av kjernebegrepene i Objektorientert programmering (OOP) språk er arv. Det er en mekanisme som lar deg lage et hierarki av klasser som deler et sett med egenskaper og metoder ved å utlede en klasse fra en annen klasse. Arv er evnen til en klasse til å utlede eller arve egenskapene fra en annen klasse.

Fordeler med arv er:

Arv lar deg arve egenskapene til en klasse, dvs. basisklasse til en annen, dvs. avledet klasse. Fordelene med arv i Python er som følger:



  • Det representerer relasjoner i den virkelige verden godt.
  • Det gir gjenbrukbarhet av en kode. Vi trenger ikke å skrive den samme koden igjen og igjen. Dessuten lar det oss legge til flere funksjoner til en klasse uten å endre den.
  • Den er transitiv i naturen, noe som betyr at hvis klasse B arver fra en annen klasse A, vil alle underklassene til B automatisk arve fra klasse A.
  • Arv tilbyr en enkel, forståelig modellstruktur.
  • Mindre utviklings- og vedlikeholdsutgifter følger av en arv.

Python arvesyntaks

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

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

Opprette en foreldreklasse

En overordnet klasse er en klasse hvis egenskaper er arvet av barneklassen. La oss lage en overordnet klasse kalt Person som har en Vise metode for å vise personens informasjon.

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

>

>

Produksjon:

Satyam 102>

Opprette en barneklasse

En barneklasse er en klasse som driver egenskapene fra sin overordnede klasse. Her Emp er en annen klasse som kommer til å arve egenskapene til Person klasse (grunnklasse).

Python3

hva er hashset java




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

>

>

Produksjon:

Mayank 103 Emp class called>

Eksempel på arv i Python

La oss se et eksempel på enkel Python-arv der en barneklasse arver egenskapene til sin overordnede klasse. I dette eksemplet er 'Person' den overordnede klassen, og 'Ansatt' 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())>

>

>

Produksjon:

Geek1 False Geek2 True>

Hva er en objektklasse i Python?

Som Java Object klasse , i Python (fra versjon 3. x), er objektet roten til alle klasser.

  • I Python 3.x er klasse Test(objekt) og klassetest like.
  • I Python 2. x oppretter klassen Test(objekt) en klasse med objektet som en forelder (kalt en ny-stil-klasse), og klassen Test oppretter en gammel-stil-klasse (uten en innvendende forelder).

Underklassing (kallende konstruktør av overordnet klasse)

En barneklasse må identifisere hvilken klasse som er dens overordnede klasse. Dette kan gjøres ved å nevne overordnet klassenavn i definisjonen av barneklassen.

datoformat.format java

Eksempel: klasse underklasse_navn (overklasse_navn)

I dette eksemplet, 'en' er forekomsten som er opprettet for klassen Person. Den påkaller __init__() til den refererte klassen. Du kan se 'objekt' skrevet i erklæringen til klassepersonen. I Python arver hver klasse fra en innebygd grunnleggende klasse kalt 'objekt'. Konstruktøren, dvs. '__init__'-funksjonen til en klasse, påkalles når vi lager en objektvariabel eller en forekomst av klassen.

Variablene som er definert i __init__() kalles forekomstvariabler eller objekter. Derfor er 'navn' og 'idnummer' objektene til klassen Person. Tilsvarende er 'lønn' og 'stilling' objektene til klassen Ansatt. Siden klassen Ansatt arver fra klassen Person, er 'navn' og 'idnummer' også objektene til klassen Ansatt.

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

>

>

Produksjon:

Rahul 886012>

Python-program for å demonstrere feil hvis vi glemmer å påkalle __init__() til overordnet

Hvis du glemmer å påkalle __init__() til den overordnede klassen, vil forekomstvariablene ikke være tilgjengelige for den underordnede klassen. Følgende kode gir en feil av samme grunn.

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

>

>

Utgang:

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

Super()-funksjonen

De super() funksjon er en innebygd funksjon som returnerer objektene som representerer den overordnede klassen. Den gir tilgang til overordnet klasses metoder og attributter i barneklassen.

Eksempel: super()-funksjon med enkel Python-arv

I dette eksemplet opprettet vi objektet 'obj' til barneklassen. Da vi kalte konstruktøren av barneklassen 'Student', initialiserte den datamedlemmene til verdiene som ble sendt under objektopprettingen. Deretter ved å bruke super()-funksjonen, påkalte vi konstruktøren til den overordnede klassen.

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

>

>

Produksjon:

java int som streng
Rahul 23 Mayank 23>

Legge til egenskaper

En av funksjonene som arv gir, er å arve egenskapene til den overordnede klassen, samt å legge til nye egne egenskaper til barneklassen. La oss 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()>

>

>

Produksjon:

Her kan vi se at vi har lagt til en ny egenskap i barneklassen, dvs. fødselsdato (dob).

Rahul 23 Mayank 23 16-03-2000>

Ulike typer Python-arv

Det er 5 forskjellige typer arv i Python. De er som følger:

    Enkeltarv : Når en barneklasse arver fra kun én foreldreklasse, kalles det enkeltarv. Vi så et eksempel ovenfor. Multippelarv : Når en barneklasse arver fra flere foreldreklasser, kalles det multiple arv.

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

>

>

Produksjon:

Base1 Base2 Derived Geek1 Geek2>
    Flernivåarv : Når vi har et barne- og barnebarnsforhold. Dette betyr at en barneklasse vil arve fra sin overordnede klasse, som igjen 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())>

>

>

innsettingssorteringsalgoritme

Produksjon:

Geek1 23 Noida>
    Hierarkisk arv Mer enn én avledet klasse kan opprettes fra en enkelt base. Hybrid arv : Denne formen kombinerer mer enn én form for arv. I utgangspunktet er det en blanding av mer enn én type arv.

For mer informasjon, les denne artikkelen: Typer av arv i Python

Private medlemmer av foreldreklassen

Vi vil ikke alltid at forekomstvariablene til den overordnede klassen skal arves av den underordnede klassen, det vil si at vi kan gjøre noen av forekomstvariablene til den overordnede klassen private, som ikke vil være tilgjengelige for den underordnede klassen.

I Python-arv kan vi gjøre en forekomstvariabel privat ved å legge til doble understrekinger foran navnet. 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)>

>

>

Utgang:

Her kan vi se at når vi prøvde å skrive ut variabelen 'c', er verdien 21 skrevet ut på konsollen. Mens når vi prøvde å skrive ut 'd', genererte det feilen. Dette er fordi variabelen 'd' gjøres privat ved å bruke understrekingen. Den er ikke tilgjengelig for barneklassen 'D' og derav feilen.

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