logo

Overerving in Python

Eén van de kernconcepten in object georiënteerd programmeren (OOP)-talen zijn overerving. Het is een mechanisme waarmee u een hiërarchie van klassen kunt creëren die een reeks eigenschappen en methoden delen, door een klasse van een andere klasse af te leiden. Overerving is het vermogen van een klasse om de eigenschappen van een andere klasse af te leiden of te erven.

Voordelen van erfenis zijn:



Met overerving kunt u de eigenschappen van een klasse, d.w.z. basisklasse, overerven naar een andere, d.w.z. afgeleide klasse. De voordelen van overerving in Python zijn als volgt:

  • Het vertegenwoordigt relaties uit de echte wereld goed.
  • Het biedt de herbruikbaarheid van een code. We hoeven niet steeds opnieuw dezelfde code te schrijven. Het stelt ons ook in staat meer functies aan een klasse toe te voegen zonder deze te wijzigen.
  • Het is transitief van aard, wat betekent dat als klasse B erft van een andere klasse A, alle subklassen van B automatisch zouden erven van klasse A.
  • Overerving biedt een eenvoudige, begrijpelijke modelstructuur.
  • Er zijn minder ontwikkelings- en onderhoudskosten als gevolg van een erfenis.

Overervingssyntaxis van Python

De syntaxis van eenvoudige overerving in Python is als volgt:

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

Een ouderklas aanmaken

Een bovenliggende klasse is een klasse waarvan de eigenschappen worden overgenomen door de onderliggende klasse. Laten we een bovenliggende klasse maken met de naam Persoon die heeft een Weergave methode om de informatie van de persoon weer te geven.



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

>

>

Uitgang:

Satyam 102>

Een onderliggende klasse aanmaken

Een onderliggende klasse is een klasse die de eigenschappen van de bovenliggende klasse aanstuurt. Hier Emp is een andere klasse die de eigenschappen van de zal erven Persoon klasse (basisklasse).

Python3

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

>

>

Uitgang:

Mayank 103 Emp class called>

Voorbeeld van overerving in Python

Laten we een voorbeeld bekijken van eenvoudige Python-overerving waarbij een onderliggende klasse de eigenschappen van zijn bovenliggende klasse overerft. In dit voorbeeld is ‘Persoon’ de bovenliggende klasse en ‘Werknemer’ de onderliggende klasse.

Python3




afrekenen met git
# 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())>

>

>

Uitgang:

Geek1 False Geek2 True>

Wat is een objectklasse in Python?

Zoals de Java-objectklasse , in Python (vanaf versie 3. x) is het object de root van alle klassen.

  • In Python 3.x zijn klasse Test(object) en klasse Test hetzelfde.
  • In Python 2. x maakt klasse Test(object) een klasse met het object als ouder (een zogenaamde klasse nieuwe stijl), en klasse Test maakt een klasse in oude stijl (zonder een bezwaar makende ouder).

Subklassen (aanroepende constructor van bovenliggende klasse)

Een onderliggende klasse moet identificeren welke klasse de bovenliggende klasse is. Dit kunt u doen door de naam van de bovenliggende klasse te vermelden in de definitie van de onderliggende klasse.

Voorbeeld: klasse subklassenaam (superklassenaam)

In dit voorbeeld 'A' is de instantie die is gemaakt voor de klasse Persoon. Het roept de __init__() van de klasse waarnaar verwezen wordt aan. Je kunt ‘object’ geschreven zien in de declaratie van de klasse Persoon. In Python erft elke klasse van een ingebouwde basisklasse genaamd ‘object’. De constructor, d.w.z. de ‘__init__’-functie van een klasse, wordt aangeroepen wanneer we een objectvariabele of een instantie van de klasse maken.

De variabelen die binnen __init__() zijn gedefinieerd, worden instantievariabelen of objecten genoemd. Daarom zijn ‘naam’ en ‘id-nummer’ de objecten van de klasse Persoon. Op dezelfde manier zijn ‘salaris’ en ‘post’ de objecten van de klasse Werknemer. Omdat de klasse Employee erft van de klasse Person, zijn ‘name’ en ‘idnumber’ ook de objecten van de klasse Employee.

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

>

>

Uitgang:

Rahul 886012>

Python-programma om fouten aan te tonen als we vergeten __init__() van de ouder aan te roepen

Als u vergeet de __init__() van de bovenliggende klasse aan te roepen, zijn de instantievariabelen ervan niet beschikbaar voor de onderliggende klasse. De volgende code produceert om dezelfde reden een fout.

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

>

>

Uitgang:

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

De super()-functie

De super()-functie is een ingebouwde functie die de objecten retourneert die de bovenliggende klasse vertegenwoordigen. Het geeft toegang tot de methoden en attributen van de bovenliggende klasse in de onderliggende klasse.

Voorbeeld: super() functie met eenvoudige Python-overerving

In dit voorbeeld hebben we het object ‘obj’ van de onderliggende klasse gemaakt. Toen we de constructor van de onderliggende klasse ‘Student’ noemden, initialiseerde deze de gegevensleden naar de waarden die werden doorgegeven tijdens het maken van het object. Vervolgens hebben we met behulp van de functie super() de constructor van de bovenliggende klasse aangeroepen.

Python3


snijd Java



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

>

>

Uitgang:

Rahul 23 Mayank 23>

Eigenschappen toevoegen

Een van de kenmerken die overerving biedt, is het erven van de eigenschappen van de bovenliggende klasse en het toevoegen van nieuwe eigen eigenschappen aan de onderliggende klasse. Laten we dit met een voorbeeld zien:

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

>

>

Uitgang:

Hier kunnen we zien dat we een nieuwe eigenschap aan de kindklasse hebben toegevoegd, namelijk de geboortedatum (geboortedatum).

Rahul 23 Mayank 23 16-03-2000>

Verschillende soorten Python-overerving

Er zijn 5 verschillende soorten overerving in Python. Ze zijn als volgt:

    Enkele overerving: Wanneer een onderliggende klasse van slechts één ouderklasse erft, wordt dit enkele overerving genoemd. We zagen hierboven een voorbeeld. Meerdere overervingen: Wanneer een onderliggende klasse erft van meerdere bovenliggende klassen, wordt dit meerdere overervingen genoemd.

In tegenstelling tot Java vertoont Python meerdere erfenissen.

Python3




concat-tekenreeksen java
# 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()>

>

>

Uitgang:

Base1 Base2 Derived Geek1 Geek2>
    Overerving op meerdere niveaus: wanneer we een kind- en kleinkindrelatie hebben. Dit betekent dat een onderliggende klasse zal erven van de bovenliggende klasse, die op zijn beurt overerft van de bovenliggende 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())>

>

>

Uitgang:

Geek1 23 Noida>
    Hiërarchische overerving Er kan meer dan één afgeleide klasse worden gemaakt op basis van één enkele basis. Hybride overerving: Deze vorm combineert meer dan één vorm van overerving. Kortom, het is een combinatie van meer dan één type erfenis.

Lees dit artikel voor meer informatie: Soorten overerving in Python

Privéleden van de ouderklasse

We willen niet altijd dat de instantievariabelen van de bovenliggende klasse worden overgenomen door de onderliggende klasse. Dat wil zeggen dat we sommige instantievariabelen van de bovenliggende klasse privé kunnen maken, wat niet beschikbaar zal zijn voor de onderliggende klasse.

Bij overerving van Python kunnen we een instantievariabele privé maken door dubbele onderstrepingstekens vóór de naam toe te voegen. Bijvoorbeeld:

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

>

>

Uitgang:

Hier kunnen we zien dat toen we probeerden de variabele ‘c’ af te drukken, de waarde 21 ervan op de console wordt afgedrukt. Terwijl toen we probeerden ‘d’ af te drukken, dit de fout genereerde. Dit komt omdat de variabele ‘d’ privé wordt gemaakt door gebruik te maken van de onderstrepingstekens. Het is niet beschikbaar voor de kindklasse ‘D’ en vandaar de fout.

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