logo

Arv i Python

Ett av kärnbegreppen i objektorienterad programmering (OOP) språk är arv. Det är en mekanism som låter dig skapa en hierarki av klasser som delar en uppsättning egenskaper och metoder genom att härleda en klass från en annan klass. Arv är förmågan hos en klass att härleda eller ärva egenskaperna från en annan klass.

Fördelarna med arv är:



Arv låter dig ärva egenskaperna för en klass, d.v.s. basklass till en annan, d.v.s. härledd klass. Fördelarna med Arv i Python är följande:

  • Det representerar verkliga relationer väl.
  • Det ger återanvändbarhet av en kod. Vi behöver inte skriva samma kod om och om igen. Det låter oss också lägga till fler funktioner till en klass utan att ändra den.
  • Det är transitivt till sin natur, vilket innebär att om klass B ärver från en annan klass A, så skulle alla underklasser av B automatiskt ärva från klass A.
  • Arv erbjuder en enkel, begriplig modellstruktur.
  • Mindre utvecklings- och underhållskostnader är resultatet av ett arv.

Python Arvssyntax

Syntaxen för enkelt arv i Python är följande:

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

Skapa en föräldraklass

En överordnad klass är en klass vars egenskaper ärvs av den underordnade klassen. Låt oss skapa en föräldraklass som heter Person som har en Visa metod för att visa personens information.



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>

Skapa en barnklass

En underordnad klass är en klass som driver egenskaperna från sin överordnade klass. Här Emp är en annan klass som kommer att ärva egenskaperna hos Person klass (basklass).

Python3

Excel datum skillnad




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>

Exempel på arv i Python

Låt oss se ett exempel på enkel Python-arv där en underordnad klass ärver egenskaperna för sin överordnade klass. I det här exemplet är 'Person' föräldraklassen och 'Anställd' är dess underordnade klass.

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>

Vad är en objektklass i Python?

Som Java Object klass , i Python (från version 3. x), är objektet roten till alla klasser.

  • I Python 3.x är klass Test(objekt) och klasstest samma.
  • I Python 2. x skapar klassen Test(objekt) en klass med objektet som förälder (kallas en ny stilklass), och klassen Test skapar en klass i gammal stil (utan en invändande förälder).

Underklassning (anropande konstruktör av överordnad klass)

En barnklass måste identifiera vilken klass som är dess överordnade klass. Detta kan göras genom att nämna föräldraklassens namn i definitionen av den underordnade klassen.

Exempel: klass underklassnamn (superklassnamn)

I det här exemplet, 'a' är instansen som skapats för klassen Person. Den anropar __init__() för den refererade klassen. Du kan se 'objekt' skrivet i deklarationen från klassen Person. I Python ärver varje klass från en inbyggd grundklass som kallas 'objekt'. Konstruktorn, dvs funktionen '__init__' för en klass anropas när vi skapar en objektvariabel eller en instans av klassen.

Variablerna som definieras inom __init__() kallas instansvariabler eller objekt. Därför är 'namn' och 'idnummer' objekten för klassen Person. På samma sätt är 'lön' och 'tjänst' föremålen för klassen Anställd. Eftersom klassen Anställd ärver från klassen Person är 'namn' och 'idnummer' också föremål för klassen Anställd.

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

>

biträdande poliskommissarie

>

Produktion:

Rahul 886012>

Python-program för att visa fel om vi glömmer att anropa __init__() för föräldern

Om du glömmer att anropa __init__() för den överordnade klassen skulle dess instansvariabler inte vara tillgängliga för den underordnade klassen. Följande kod ger ett fel av samma anledning.

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

>

>

Utgång:

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

Super()-funktionen

De super() funktion är en inbyggd funktion som returnerar objekten som representerar den överordnade klassen. Det ger tillgång till föräldraklassens metoder och attribut i den underordnade klassen.

Exempel: super() funktion med enkel Python-arv

I det här exemplet skapade vi objektet 'obj' för barnklassen. När vi kallade konstruktorn för barnklassen 'Student', initierade den datamedlemmarna till de värden som skickades under objektskapandet. Sedan använde vi funktionen super() och anropade konstruktorn för den överordnade 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()>

>

>

Produktion:

Rahul 23 Mayank 23>

Lägger till egenskaper

En av funktionerna som arv ger är att ärva egenskaperna för den överordnade klassen samt att lägga till nya egna egenskaper till den underordnade klassen. Låt oss se detta med ett exempel:

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:

kali linux terminal

Här kan vi se att vi lagt till en ny egenskap i barnklassen, det vill säga födelsedatum (dob).

Rahul 23 Mayank 23 16-03-2000>

Olika typer av Python Arv

Det finns 5 olika typer av arv i Python. De är följande:

    Enstaka arv : När en barnklass ärver från endast en föräldraklass kallas det för ensarv. Vi såg ett exempel ovan. Multipelarv : När en barnklass ärver från flera föräldraklasser kallas det multipelarv.

Till skillnad från Java visar python flera 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:

natasha dalal
Base1 Base2 Derived Geek1 Geek2>
    Flernivåarv : När vi har ett barn- och barnbarnsförhållande. Det betyder att en barnklass kommer att ärva från sin föräldraklass, som i sin tur ärver från sin föräldraklass.

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

>

>

Produktion:

Geek1 23 Noida>
    Hierarkiskt arv Mer än en härledd klass kan skapas från en enda bas. Hybrid arv : Denna form kombinerar mer än en form av arv. I grund och botten är det en blandning av mer än en typ av arv.

För mer information, läs den här artikeln: Typer av arv i Python

Privata medlemmar i föräldraklassen

Vi vill inte alltid att instansvariablerna för den överordnade klassen ska ärvas av den underordnade klassen, det vill säga vi kan göra några av instansvariablerna i den överordnade klassen privata, som inte kommer att vara tillgängliga för den underordnade klassen.

I Python-arv kan vi göra en instansvariabel privat genom att lägga till dubbla understreck före dess namn. Till exempel:

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

>

>

Utgång:

Här kan vi se att när vi försökte skriva ut variabeln 'c' så skrivs dess värde 21 ut på konsolen. När vi försökte skriva ut 'd' genererade det felet. Detta beror på att variabeln 'd' görs privat genom att använda understreck. Det är inte tillgängligt för barnklassen 'D' och därav felet.

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