Un dels conceptes bàsics en programació orientada a objectes Els idiomes (OOP) són l'herència. És un mecanisme que permet crear una jerarquia de classes que comparteixen un conjunt de propietats i mètodes derivant una classe d'una altra classe. L'herència és la capacitat d'una classe per derivar o heretar les propietats d'una altra classe.
Els beneficis de l'herència són:
L'herència us permet heretar les propietats d'una classe, és a dir, una classe base a una altra, és a dir, una classe derivada. Els avantatges de l'herència a Python són els següents:
- Representa bé les relacions del món real.
- Proporciona el reutilitzabilitat d'un codi. No hem d'escriure el mateix codi una vegada i una altra. A més, ens permet afegir més funcions a una classe sense modificar-la.
- És de naturalesa transitiva, el que significa que si la classe B hereta d'una altra classe A, llavors totes les subclasses de B heretarien automàticament de la classe A.
- L'herència ofereix una estructura de model senzilla i comprensible.
- Menys despeses de desenvolupament i manteniment resulten d'una herència.
Sintaxi d'herència de Python
La sintaxi de l'herència simple en Python és la següent:
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body}> Creació d'una classe de pares
Una classe pare és una classe les propietats de la qual són heretades per la classe fill. Creem una classe pare anomenada Persona que té a Mostra mètode per mostrar la informació de la persona.
Python 3
# 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()> |
>
>
Sortida:
int a cadena java
Satyam 102>
Creació d'una classe infantil
Una classe fill és una classe que impulsa les propietats de la seva classe pare. Aquí Emp és una altra classe que heretarà les propietats del Persona classe (classe base).
Python 3
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>()> |
>
>
Sortida:
Mayank 103 Emp class called>
Exemple d'herència en Python
Vegem un exemple d'herència simple de Python en què una classe fill hereta les propietats de la seva classe pare. En aquest exemple, 'Persona' és la classe principal i 'Empleat' és la classe secundària.
Python 3
# 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())> |
>
>
Sortida:
Geek1 False Geek2 True>
Què és una classe d'objectes a Python?
Com el Classe d'objectes Java , a Python (a partir de la versió 3. x), l'objecte és l'arrel de totes les classes.
- A Python 3.x, la classe Test(objecte) i la classe Test són iguals.
- A Python 2. x, la classe Test(objecte) crea una classe amb l'objecte com a pare (anomenada classe d'estil nou) i la classe Test crea una classe d'estil antic (sense un pare oposat).
Subclassificació (constructor de trucades de la classe pare)
Una classe secundaria ha d'identificar quina és la seva classe pare. Això es pot fer esmentant el nom de la classe pare a la definició de la classe secundària.
Exemple: classe subclass_name (superclass_name)
En aquest exemple, 'a' és la instància creada per a la classe Person. Invoca el __init__() de la classe referida. Podeu veure 'objecte' escrit a la declaració de la persona de classe. A Python, cada classe hereta d'una classe bàsica integrada anomenada 'objecte'. El constructor, és a dir, la funció '__init__' d'una classe s'invoca quan creem una variable objecte o una instància de la classe.
Les variables definides dins de __init__() s'anomenen variables d'instància o objectes. Per tant, 'nom' i 'número d'identificació' són els objectes de la classe Persona. De la mateixa manera, 'salari' i 'post' són els objectes de la classe Empleat. Com que la classe Employee hereta de la classe Person, 'nom' i 'idnumber' també són els objectes de la classe Employee.
Python 3
# 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()> |
>
>
Sortida:
Rahul 886012>
Programa Python per demostrar l'error si ens oblidem d'invocar __init__() del pare
Si oblideu invocar el __init__() de la classe pare, les seves variables d'instància no estarien disponibles per a la classe secundària. El codi següent produeix un error pel mateix motiu.
Python 3
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)> |
>
>
Sortida:
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'>
La funció super().
El funció super(). és una funció integrada que retorna els objectes que representen la classe pare. Permet accedir als mètodes i atributs de la classe pare a la classe fill.
Exemple: funció super() amb herència senzilla de Python
En aquest exemple, hem creat l'objecte 'obj' de la classe fill. Quan vam cridar el constructor de la classe secundària 'Estudiant', va inicialitzar els membres de dades als valors passats durant la creació de l'objecte. A continuació, utilitzant la funció super(), vam invocar el constructor de la classe pare.
Python 3
# 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()> |
>
>
Sortida:
Rahul 23 Mayank 23>
Afegint propietats
Una de les característiques que ofereix l'herència és heretar les propietats de la classe pare, així com afegir noves propietats pròpies a la classe fill. Vegem-ho amb un exemple:
Python 3
# 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()> |
>
>
Sortida:
Aquí podem veure que hem afegit una nova propietat a la classe infantil, és a dir, la data de naixement (dob).
Rahul 23 Mayank 23 16-03-2000>
Diferents tipus d'herència de Python
Hi ha 5 tipus diferents d'herència a Python. Són els següents:
- Herència única: quan una classe fill hereta només d'una classe pare, s'anomena herència única. Hem vist un exemple més amunt. Herències múltiples: quan una classe secundària hereta de diverses classes pares, s'anomena herències múltiples.
A diferència de Java, Python mostra múltiples herències.
Python 3
# 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()> |
>
>
Sortida:
Base1 Base2 Derived Geek1 Geek2>
- Herència multinivell: Quan tenim una relació fill-nét. Això vol dir que una classe fill heretarà de la seva classe pare, que al seu torn està heretant de la seva classe pare.
Python 3
# 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())> |
>
>
Sortida:
Geek1 23 Noida>
- Herència jeràrquica Es pot crear més d'una classe derivada a partir d'una sola base. Herència híbrida: aquesta forma combina més d'una forma d'herència. Bàsicament, és una barreja de més d'un tipus d'herència.
Per a més detalls, llegiu aquest article: Tipus d'herència en Python
Membres privats de la classe de pares
No sempre volem que les variables d'instància de la classe pare siguin heretades per la classe fill, és a dir, podem fer privades algunes de les variables d'instància de la classe pare, que no estaran disponibles per a la classe fill.
A l'herència de Python, podem fer privada una variable d'instància afegint guions baixos dobles abans del seu nom. Per exemple:
Python 3
# 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)> |
>
>
Sortida:
Aquí podem veure que quan vam intentar imprimir la variable 'c', el seu valor 21 s'imprimeix a la consola. Mentre que quan vam intentar imprimir 'd', va generar l'error. Això es deu al fet que la variable 'd' es fa privada mitjançant l'ús dels guions baixos. No està disponible per a la classe secundaria 'D' i, per tant, l'error.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'>