Maison > Article > développement back-end > Une brève explication de l'héritage python et de l'héritage multiple (exemple de code)
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!