Maison  >  Article  >  développement back-end  >  Une brève explication de l'héritage python et de l'héritage multiple (exemple de code)

Une brève explication de l'héritage python et de l'héritage multiple (exemple de code)

不言
不言original
2018-09-12 17:53:172055parcourir

Ce que cet article vous apporte est une explication simple (exemple de code) de l'héritage Python et de l'héritage multiple. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

N'oubliez pas ce qui suit :

Le sous-classement direct des types intégrés (tels que dict, list ou str) est sujet aux erreurs, car les méthodes des types intégrés ignorent généralement les méthodes remplacées par l'utilisateur. et ne les sous-classez pas. En classant les types intégrés, les classes définies par l'utilisateur doivent hériter du module collections.

    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2) # 错误案例
class AnswerDict(dict):
    def __getitem__(self, item): # 错误案例
        return 42
import collections
class DoppelDict2(collections.UserDict): # 正确案例
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict): # 正确案例
    def __getitem__(self, item):
        return 42

Un autre problème lié à l'héritage multiple est le suivant : si une superclasse du même niveau définit un attribut avec le même nom, comment Python détermine-t-il lequel utiliser

class DoppelDict(dict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict(dict):
    def __getitem__(self, item):
        return 42
import collections
class DoppelDict2(collections.UserDict):
    def __setitem__(self, key, value):
        super().__setitem__(key, [value] * 2)
class AnswerDict2(collections.UserDict):
    def __getitem__(self, item):
        return 42
class A:
    def ping(self):
        print('Ping:', self)
class B(A):
    def pong(self):
        print('pong:', self)
class C(A):
    def pong(self):
        print('PONG:', self)
class D(B, C):
    def ping(self):
        super().ping()
        print('post-ping:', self)
    def pingpong(self):
        self.ping()
        super().ping()
        self.pong()
        super().pong()
        C.pong(self)
if __name__ == '__main__':
    d = D()
    print(d.pong()) # 输出来源于B
    print(C.pong(d)) #输出来源于C 超类的方法都可以直接调用,此时要把实例作为显示参数传入.

Ce que Python peut appeler différemment Quelle méthode, par ordre d'analyse des méthodes
>>> D.mro()
[f90f74cf2b5eef2157d27f4b07137685, ffdc4e5e2594b3c3c75e9dd0444bf838, f24e43e93c21767067aa511be52dd32d, d65e71c32c2035ca4f3e3c46100a7a5f, 0b6b3070adce8118f880cf43f8bc8037]
Si vous souhaitez déléguer les appels de méthode à la super classe, la méthode recommandée est d'utiliser le fonction super() intégrée.

Ce qui suit est l'interprétation de la méthode d.pingpong()

>>> self.ping()

Ping : 1350d08e89b28e77ab558f9fd9c2231c post-ping : 1350d08e89b28e77ab558f9fd9c2231c Le premier appel est self.ping(), qui exécute la méthode ping de la classe D.

Le deuxième appel Celui-ci est super().ping(), ignorez la méthode ping de la classe D et recherchez la méthode ping de la classe A. Ping : 1350d08e89b28e77ab558f9fd9c2231c

Le troisième appel est self La méthode .pong(), basée sur __mro__, trouve la méthode pong implémentée par la classe B. pong : 1350d08e89b28e77ab558f9fd9c2231c

Le quatrième appel est super().pong(), qui est également basé sur __mro__, recherchez la méthode pong implémentée par la classe B. pong : 1350d08e89b28e77ab558f9fd9c2231c

Le cinquième appel est C.pong(self), ignorant __mro__ et trouvant C. La méthode pong implémentée par la classe. PONG : 1350d08e89b28e77ab558f9fd9c2231c

Recommandations associées :

Héritage unique et héritage multiple en Python

Explication des classes Python et de l'héritage

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