Héritage en Python
L'un des concepts fondamentaux de programmation orientée objet (POO) les langues sont un héritage. Il s'agit d'un mécanisme qui vous permet de créer une hiérarchie de classes partageant un ensemble de propriétés et de méthodes en dérivant une classe d'une autre classe. L'héritage est la capacité d'une classe à dériver ou à hériter des propriétés d'une autre classe.
Les avantages de l’héritage sont :
L'héritage vous permet d'hériter des propriétés d'une classe, c'est-à-dire d'une classe de base, vers une autre, c'est-à-dire une classe dérivée. Les avantages de l'héritage en Python sont les suivants :
- Cela représente bien les relations du monde réel.
- Il fournit le réutilisabilité d'un code. Nous n’avons pas besoin d’écrire encore et encore le même code. De plus, cela nous permet d'ajouter plus de fonctionnalités à une classe sans la modifier.
- Elle est de nature transitive, ce qui signifie que si la classe B hérite d’une autre classe A, alors toutes les sous-classes de B hériteraient automatiquement de la classe A.
- L'héritage offre une structure de modèle simple et compréhensible.
- Moins de dépenses de développement et d'entretien résultent d'un héritage.
Syntaxe d'héritage Python
La syntaxe de l'héritage simple en Python est la suivante :
Class BaseClass: {Body} Class DerivedClass(BaseClass): {Body} Création d'une classe parent
Une classe parent est une classe dont les propriétés sont héritées par la classe enfant. Créons une classe parent appelée Personne qui a un Afficher méthode pour afficher les informations de la personne.
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()> |
Sortir:
Satyam 102
Créer une classe enfant
Une classe enfant est une classe qui gère les propriétés de sa classe parent. Ici Emp est une autre classe qui va hériter des propriétés du Personne classe (classe de base).
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> ()> |
Sortir:
Mayank 103 Emp class called
Exemple d'héritage en Python
Voyons un exemple d'héritage Python simple dans lequel une classe enfant hérite des propriétés de sa classe parent. Dans cet exemple, « Personne » est la classe parent et « Employé » est sa classe enfant.
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())> |
Sortir:
Geek1 False Geek2 True
Qu'est-ce qu'une classe d'objets en Python ?
Comme le Classe d'objet Java , en Python (à partir de la version 3. x), l'objet est la racine de toutes les classes.
- Dans Python 3.x, la classe Test(object) et la classe Test sont identiques.
- Dans Python 2. x, la classe Test(object) crée une classe avec l'objet comme parent (appelée classe de nouveau style) et la classe Test crée une classe de style ancien (sans parent objecteur).
Sous-classement (constructeur appelant de la classe parent)
Une classe enfant doit identifier quelle classe est sa classe parent. Cela peut être fait en mentionnant le nom de la classe parent dans la définition de la classe enfant.
Exemple: classe nom_sous-classe (nom_superclasse)
Dans cet exemple, 'un' est l'instance créée pour la classe Person. Il invoque le __init__() de la classe référencée. Vous pouvez voir « objet » écrit dans la déclaration de la classe Person. En Python, chaque classe hérite d'une classe de base intégrée appelée « objet ». Le constructeur, c'est-à-dire la fonction '__init__' d'une classe, est invoqué lorsque nous créons une variable objet ou une instance de la classe.
Les variables définies dans __init__() sont appelées variables d'instance ou objets. Par conséquent, « nom » et « numéro d’identification » sont les objets de la classe Person. De même, « salaire » et « poste » sont les objets de la classe Employé. Puisque la classe Employee hérite de la classe Person, « name » et « idnumber » sont également les objets de la classe 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()> |
Sortir:
Rahul 886012
Programme Python pour démontrer l'erreur si nous oublions d'invoquer __init__() du parent
Si vous oubliez d'invoquer le __init__() de la classe parent, ses variables d'instance ne seront pas disponibles pour la classe enfant. Le code suivant génère une erreur pour la même raison.
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)> |
Sortir :
Traceback (most recent call last): File '/home/de4570cca20263ac2c4149f435dba22c.py', line 12, in print (object.name) AttributeError: 'B' object has no attribute 'name'
La fonction super()
Le fonction super() est une fonction intégrée qui renvoie les objets qui représentent la classe parent. Il permet d’accéder aux méthodes et attributs de la classe parent dans la classe enfant.
Exemple: fonction super() avec héritage Python simple
Dans cet exemple, nous avons créé l'objet 'obj' de la classe enfant. Lorsque nous avons appelé le constructeur de la classe enfant « Student », il a initialisé les données membres aux valeurs transmises lors de la création de l'objet. Ensuite, à l’aide de la fonction super(), nous avons invoqué le constructeur de la classe parent.
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()> |
Sortir:
Rahul 23 Mayank 23
Ajout de propriétés
L'une des fonctionnalités offertes par l'héritage consiste à hériter des propriétés de la classe parent ainsi qu'à ajouter de nouvelles propriétés à la classe enfant. Voyons cela avec un exemple :
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()> |
Sortir:
Ici, nous pouvons voir que nous avons ajouté une nouvelle propriété à la classe enfant, c'est-à-dire la date de naissance (dob).
Rahul 23 Mayank 23 16-03-2000
Différents types d'héritage Python
Il existe 5 types différents d'héritage en Python. Ils sont les suivants :
- Héritage unique : Lorsqu'une classe enfant hérite d'une seule classe parent, on parle d'héritage unique. Nous avons vu un exemple ci-dessus. Héritages multiples : Lorsqu'une classe enfant hérite de plusieurs classes parents, on parle d'héritages multiples.
Contrairement à Java, Python affiche plusieurs héritages.
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()> |
Sortir:
Base1 Base2 Derived Geek1 Geek2
- Héritage multiniveau : Lorsque nous avons une relation enfant et petit-enfant. Cela signifie qu'une classe enfant héritera de sa classe parent, qui à son tour héritera de sa classe parent.
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())> |
Sortir:
Geek1 23 Noida
- Héritage hiérarchique Plusieurs classes dérivées peuvent être créées à partir d'une seule base. Héritage hybride : Cette forme combine plusieurs formes d'héritage. Fondamentalement, il s’agit d’un mélange de plusieurs types d’héritage.
Pour plus de détails, veuillez lire cet article : Types d'héritage en Python
Membres privés de la classe parent
Nous ne voulons pas toujours que les variables d'instance de la classe parent soient héritées par la classe enfant, c'est-à-dire que nous pouvons rendre privées certaines des variables d'instance de la classe parent, qui ne seront pas disponibles pour la classe enfant.
Dans l'héritage Python, nous pouvons rendre une variable d'instance privée en ajoutant des doubles traits de soulignement avant son nom. Par exemple:
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)> |
Sortir :
Ici, nous pouvons voir que lorsque nous avons essayé d'imprimer la variable 'c', sa valeur 21 est imprimée sur la console. Alors que lorsque nous avons essayé d’imprimer « d », cela a généré l’erreur. En effet, la variable « d » est rendue privée en utilisant les traits de soulignement. Il n'est pas disponible pour la classe enfant « D » et donc l'erreur.
21 File '/home/993bb61c3e76cda5bb67bd9ea05956a1.py', line 16, in print (object1.d) AttributeError: type object 'D' has no attribute 'd'