Python >> Tutoriel Python >  >> Python

Comprendre la méthode super() en Python

Présentation

Aujourd'hui, dans ce tutoriel, nous allons discuter de la méthode super() en Python .

Avant de plonger directement dans le sujet, nous vous recommandons fortement de suivre le didacticiel sur l'héritage Python.

Une fois que vous connaissez l'héritage en Python, nous pouvons commencer.

La méthode super() en Python

Le super method renvoie un objet proxy qui délègue les appels de méthode à une classe parente ou sœur de type . Ceci est utile pour accéder aux méthodes héritées qui ont été remplacées dans une classe.

Ou simplement, il est utilisé pour appeler le constructeur, c'est-à-dire le __init__() méthode de la superclasse .

Syntaxe pour utiliser super en Python est donné ci-dessous.

super([type[, object-or-type]])

En Python 3.x versions, nous pouvons utiliser super sans passer les deux paramètres ci-dessus. Regardez l'extrait de code ci-dessous.

class C(B):
    def method(self, arg):
        super().method(arg)

Ici, C est la classe dérivée, B est la classe de base, la méthode est une fonction définie par l'utilisateur avec l'argument arg .

Comme vous pouvez le voir, la ligne super().method(arg) est en fait équivalent à super( C, self).method(arg) en Python 3.x . Ceci n'est pas autorisé dans Python 2.x . Par conséquent, utiliser super il est un peu délicat.

Utiliser super()

Considérez l'exemple ci-dessous.

class Demo:
    a = 0
    b = 0
    c = 0
    def __init__(self,A,B,C):
        self.a = A
        self.b = B
        self.c = C
    def display(self):
        print(self.a, self.b, self.c)

class Newdemo(Demo):
    d = 0
    def __init__(self,A,B,C,D):
        self.a = A
        self.b = B
        self.c = C
        self.d = D

    def display(self):
        print(self.a, self.b, self.c,self.d)

B1 = Demo(100,200,300)
print("Contents of Base Class:")
B1.display()
D1 = Newdemo(10,20,30,40)
print("Contents of Derived Class:")
D1.display()

Sortie :

Dans l'exemple ci-dessus, les classes dérivées de la classe de base Demo n'ont pas été mis en œuvre de manière efficace ou robuste.

La classe dérivée Newdemo initialise explicitement la valeur des champs A, B et C de la classe de base. La même duplication de code est trouvée lors de l'initialisation des mêmes champs dans la classe de base, Demo aussi.

Ce processus est inefficace. Cela implique qu'une sous-classe doit avoir accès aux membres d'une superclasse .

Par conséquent, chaque fois qu'une sous-classe doit faire référence à sa super classe immédiate, super entre en scène.

Super() pour appeler le constructeur de super classe

Appliquons maintenant le super() méthode pour l'exemple ci-dessus.

class Demo:
    a = 0
    b = 0
    c = 0
    def __init__(self,A,B,C):
        self.a = A
        self.b = B
        self.c = C
    def display(self):
        print(self.a, self.b, self.c)

class Newdemo(Demo):
    d = 0
    def __init__(self,A,B,C,D):
        self.d = D
        super().__init__(A,B,C) #super to call super Class
        #The __init__() Method

    def display(self):
        print(self.a, self.b, self.c,self.d)

B1 = Demo(12,34,56)
print("Contents of Base Class:")
B1.display()
D1 = Newdemo(11,22,33,44)
print("Contents of Derived Class:")
D1.display()

Sortie :

Ici, la classe dérivée Newdemo appelle le super() avec des arguments a , b , et c . Cela provoque le constructeur __init__ de la classe de base, soit Demo être appelé. Ceci initialise les valeurs de a , b , et c . D'où le Newdemo la classe n'initialise plus les valeurs elle-même.

Utiliser super dans Python 2.x

La syntaxe appeler un super constructeur de classe en Python 2.x est donné ci-dessous,

super(Derived_Class_Name, self).__init__(Parameters_of_Super_Class_Constructor)

Par conséquent, nous devons apporter quelques modifications mineures à l'exemple ci-dessus si nous voulons l'utiliser en Python 2 .

Tout d'abord, nous devons mettre object dans la classe de base comme indiqué ci-dessous.

class Demo(object):
...#other statements

Et deuxièmement, passez Newdemo et self sur le site d'appel super classe. Comme ça.

super(Newdemo,self).__init__(A,B,C) #super to call super Class
...        #The __init__() Method

Pourquoi nous avons besoin de super()

En cas de héritage unique avec une classe parent et enfant, le super La fonction est utilisée pour faire implicitement référence à la classe parent sans la nommer explicitement. Cela rend le code plus efficace, maintenable et robuste par nature.

Ensuite, pour un héritage à plusieurs niveaux , le super peut être utilisée pour faire référence implicitement à la superclasse immédiate. Cela rend à nouveau le code plus facile à comprendre et hautement maintenable.

Conclusion

Donc, dans ce tutoriel, nous avons compris le concept de la méthode super() en Python , son utilisation et son besoin.

Pour toute autre question, n'hésitez pas à commenter ci-dessous.

Références

  • Python Super – Article de développement de journal,
  • Que fait "super" en Python ? – Question StackOverflow,
  • Python super – Documentation officielle.

Prochain article