Maison  >  Article  >  développement back-end  >  explication de l'héritage de classe python

explication de l'héritage de classe python

PHPz
PHPzoriginal
2017-04-02 13:18:001198parcourir

Pour de nombreux articles expliquant l'héritage de la classe python, la plupart d'entre eux parlent de concepts tels que le oop et le polymorphisme, je pense que cela peut être utile aux développeurs ayant une certaine base. . Ce n'est pas si gros. Il est préférable d'utiliser directement le code écrit dans diverses situations pour montrer l'effet de l'exécution du code pour une certaine situation de code. Cela peut être plus utile aux développeurs. Ne dites pas de bêtises, allez simplement au code.

Il n'y a pas de distinction entre les classes classiques et les classes de nouveau style ici. L'analyse suivante s'applique à la fois aux classes de nouveau style et aux classes classiques

Pour la fonction init dans. la classe, c'est juste un appel d'initialisation Une fonction (ps : l'initialisation et la création d'instance ne sont pas un processus, la création de l'instance se fait via une fonction create), s'il n'y a pas de déclaration explicite de la fonction init dans la sous-classe, la sous-classe appellera la fonction init de la classe parent, mais la fonction init dans la classe parent de la classe parent ne sera pas appelée à nouveau. Si la fonction init est explicitement déclarée, la fonction d'initialisation de la classe parent ne sera pas appelée pendant. Lors de l'initialisation de la sous-classe, seule la déclaration dans la fonction init de la sous-classe sera appelée, et en même temps, l'instance de la sous-classe n'aura pas l'attribut déclaré dans la fonction init de la classe parent.

class animal():
    name="hh"
    sex="man"
    def init(self):        self.height=10
        self.weight=50
    def deception(self):
        print "ansible.height:"+self.height+" animal.weight:"+self.weight    def run(self):
        print "animal is running...."class dog(animal):
    def init(self):
        passif name=="main":
   dg=dog()
   print dg.dict

Le résultat de l'exécution à ce moment est

{}

Lorsque la classe de chien est modifiée comme suit (ps : il n'y a pas d'initialisation déclarée méthode affichée à ce moment) :

class dog(animal):
    def run(self):
        print "dog is running..."

À ce moment, en raison du parent directement appelé La méthode init de la classe animal, le résultat est le suivant :

{'weight' : 50, 'hauteur' : 10}

S'il y a une classe héritant de la classe chien à ce moment-là, elle le fera. Que se passe-t-il ? (L'interpréteur Python recherche d'abord la méthode init dans la sous-classe. Si elle n'est pas trouvée, il la recherche ensuite dans la classe parent jusqu'à ce qu'elle soit trouvée et l'exécute. Il n'exécutera plus la méthode init de la classe parent de la classe parent. Aucun init n'est en cours d'exécution pour le moment. Aucun attribut n'est créé dans la méthode. Par exemple, dans l'exemple ci-dessus, les attributs de poids et de taille ne sont pas inclus dans l'exemple obtenu lors de la première exécution)

class animal():
    name="hh"
    sex=""
    def init(self):        self.height=10
        self.weight=50
    def deception(self):
        print "ansible.height:"+self.height+" animal.weight:"+self.weight    def run(self):
        print "animal is running...."class dog(animal):
    def init(self):
        pass    def run(self):
        print "dog is running..."class jinmao(dog):
    # def init(self):
    #     self.ji="jinmao"
    passif name=="main":
   dg=jinmao()
   print dg.dict

Le résultat à ce moment est également

{}

Que se passera-t-il en cas d'héritage multiple de classes ? (Dans l'héritage multiple, la fonction init de la classe parent déclarée par le premier paramètre du paramètre d'héritage de la classe sera exécutée. S'il n'y a pas de fonction init dans la classe parent, continuez à rechercher s'il existe une fonction init dans la classe parent. classe parent de la classe parent, et ainsi de suite. Si l'en-tête est trouvé ou non, il est remplacé par la classe parent déclarée par le deuxième paramètre. Le processus est le même que le premier paramètre jusqu'à ce que la fonction init soit trouvée. aucun en-tête n'est trouvé, il n'est pas initialisé.) Le code peut être testé par vous-même à partir de l'exemple précédent.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn