Moștenirea în Python
Unul dintre conceptele de bază în programare orientată pe obiecte (OOP) limbile este moștenire. Este un mecanism care vă permite să creați o ierarhie de clase care împărtășesc un set de proprietăți și metode prin derivarea unei clase dintr-o altă clasă. Moștenirea este capacitatea unei clase de a obține sau de a moșteni proprietățile din altă clasă.
Beneficiile moștenirii sunt:
Moștenirea vă permite să moșteniți proprietățile unei clase, adică o clasă de bază către o altă clasă, adică o clasă derivată. Beneficiile moștenirii în Python sunt următoarele:
- Reprezintă bine relațiile din lumea reală.
- Acesta oferă reutilizabilitate a unui cod. Nu trebuie să scriem același cod din nou și din nou. De asemenea, ne permite să adăugăm mai multe funcții la o clasă fără a o modifica.
- Este de natură tranzitivă, ceea ce înseamnă că dacă clasa B moștenește de la o altă clasă A, atunci toate subclasele B ar moșteni automat din clasa A.
- Moștenirea oferă o structură model simplă, ușor de înțeles.
- Dintr-o moștenire rezultă mai puține cheltuieli de dezvoltare și întreținere.
Sintaxa moștenirii Python
Sintaxa moștenirii simple în Python este următoarea:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body} Crearea unei clase parentale
O clasă părinte este o clasă ale cărei proprietăți sunt moștenite de clasa copil. Să creăm o clasă părinte numită Persoană care are o Afişa metoda de a afișa informațiile persoanei.
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()> |
Ieșire:
Satyam 102
Crearea unei clase de copii
O clasă copil este o clasă care conduce proprietățile din clasa sa părinte. Aici Emp este o altă clasă care va moșteni proprietățile lui Persoană clasa (clasa de bază).
Python3
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> ()> |
Ieșire:
Mayank 103 Emp class called
Exemplu de moștenire în Python
Să vedem un exemplu de moștenire Python simplă în care o clasă copil moștenește proprietățile clasei părinte. În acest exemplu, „Persoană” este clasa părinte, iar „Angajat” este clasa sa secundară.
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())> |
Ieșire:
Geek1 False Geek2 True
Ce este o clasă de obiecte în Python?
Ca Clasa obiect Java , în Python (din versiunea 3. x), obiectul este rădăcina tuturor claselor.
- În Python 3.x, clasa Test(obiect) și clasa Test sunt aceleași.
- În Python 2. x, clasa Test(obiect) creează o clasă cu obiectul ca părinte (numită clasă de stil nou), iar clasa Test creează o clasă de stil vechi (fără un părinte care se opune).
Subclasare (constructorul de apelare al clasei părinte)
O clasă copil trebuie să identifice care clasă este clasa sa părinte. Acest lucru se poate face prin menționarea numelui clasei părinte în definiția clasei copil.
Exemplu: clasa subclass_name (superclass_name)
În acest exemplu, 'A' este instanța creată pentru clasa Person. Ea invocă __init__() din clasa referită. Puteți vedea „obiect” scris în declarația Persoana clasei. În Python, fiecare clasă moștenește dintr-o clasă de bază încorporată numită „obiect”. Constructorul, adică funcția „__init__” a unei clase este invocată atunci când creăm o variabilă obiect sau o instanță a clasei.
Variabilele definite în __init__() sunt numite variabile de instanță sau obiecte. Prin urmare, „nume” și „număr id” sunt obiectele clasei Persoană. În mod similar, „salariu” și „post” sunt obiectele clasei Angajat. Deoarece clasa Employee moștenește din clasa Persoană, „nume” și „număr id” sunt, de asemenea, obiectele clasei Angajat.
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()> |
Ieșire:
Rahul 886012
Program Python pentru a demonstra eroarea dacă uităm să invocăm __init__() al părintelui
Dacă uitați să invocați __init__() al clasei părinte, atunci variabilele sale de instanță nu vor fi disponibile pentru clasa copil. Următorul cod produce o eroare din același motiv.
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)> |
Ieșire:
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'
Funcția super().
The funcția super(). este o funcție încorporată care returnează obiectele care reprezintă clasa părinte. Permite accesarea metodelor și atributelor clasei părinte în clasa fii.
Exemplu: funcția super() cu moștenire Python simplă
În acest exemplu, am creat obiectul „obj” al clasei copil. Când am numit constructorul clasei copil „Student”, acesta a inițializat membrii datelor la valorile transmise în timpul creării obiectului. Apoi, folosind funcția super(), am invocat constructorul clasei părinte.
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()> |
Ieșire:
Rahul 23 Mayank 23
Adăugarea proprietăților
Una dintre caracteristicile pe care le oferă moștenirea este moștenirea proprietăților clasei părinte, precum și adăugarea de noi proprietăți proprii la clasa copil. Să vedem asta cu un exemplu:
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()> |
Ieșire:
Aici putem vedea că am adăugat o nouă proprietate la clasa de copii, adică data nașterii (dob).
Rahul 23 Mayank 23 16-03-2000
Diferite tipuri de moștenire Python
Există 5 tipuri diferite de moștenire în Python. Acestea sunt după cum urmează:
- Moștenire unică: Când o clasă copil moștenește de la o singură clasă părinte, se numește moștenire unică. Am văzut un exemplu mai sus. Moșteniri multiple: Când o clasă copil moștenește din mai multe clase părinte, se numește moșteniri multiple.
Spre deosebire de Java, python arată mai multe moșteniri.
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()> |
Ieșire:
Base1 Base2 Derived Geek1 Geek2
- Moștenirea pe mai multe niveluri: Când avem o relație între copil și nepot. Aceasta înseamnă că o clasă copil va moșteni de la clasa sa părinte, care, la rândul său, moștenește de la clasa părinte.
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())> |
Ieșire:
Geek1 23 Noida
- Moștenirea ierarhică Mai mult de o clasă derivată poate fi creată dintr-o singură bază. Moștenire hibridă: această formă combină mai mult de o formă de moștenire. Practic, este un amestec de mai mult de un tip de moștenire.
Pentru mai multe detalii, vă rugăm să citiți acest articol: Tipuri de moștenire în Python
Membrii privați ai clasei de părinte
Nu dorim întotdeauna ca variabilele de instanță ale clasei părinte să fie moștenite de clasa copil, adică putem face ca unele dintre variabilele de instanță ale clasei părinte să fie private, care nu vor fi disponibile pentru clasa copil.
În moștenirea Python, putem face o variabilă de instanță privată prin adăugarea de liniuțe de subliniere duble înaintea numelui acesteia. De exemplu:
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)> |
Ieșire:
Aici putem vedea că atunci când am încercat să tipărim variabila „c”, valoarea sa 21 este tipărită pe consolă. În timp ce atunci când am încercat să tipărim „d”, a generat eroarea. Acest lucru se datorează faptului că variabila „d” este făcută privată prin utilizarea caracterelor de subliniere. Nu este disponibil pentru clasa copil „D” și, prin urmare, eroarea.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'