English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La fonction super() intégrée est utilisée pour appeler une méthode d'une classe parente (classe mère).
super est utilisé pour résoudre les problèmes de multiple héritage, l'appel direct des méthodes des classes parentes par le nom de la classe ne pose pas de problème dans le cas de l'héritage simple, mais lorsqu'il s'agit de l'héritage multiple, il s'agit de problèmes tels que l'ordre de recherche (MRO), les appels redondants (héritage en forme de diamant) et autres.
MRO est la liste d'ordre de résolution des méthodes des classes, qui est en réalité la liste de l'ordre des méthodes des classes parentes lors de l'héritage.
Dans Python, super() a deux principaux cas d'utilisation :
使我们避免显式使用基类名称
处理多重继承
Dans le cas de l'héritage simple, il nous permet de nous référer à la classe de base super() par le biais de la référence.
class Mammal(object): def __init__(self, mammalName): print(mammalName, 'est un animal de sang chaud.') class Dog(Mammal): def __init__(self): print('Le chien a quatre pattes.') super().__init__('chien') d1 = Dog()
Résultat de la sortie
Le chien a quatre pattes. Le chien est un animal de sang chaud.
Ici, nous appelons la méthode __init__() de la classe Mammal (de la classe Dog)
super().__init__('Dog')
au lieu de
Mammal.__init__(self, 'Dog')
Étant donné que le nom de la classe de base n'est pas nécessaire lors de l'appel des membres, il est facile de changer le nom de la classe de base (si nécessaire).
# Changer la classe de base en CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Le chien a quatre pattes.') # Ne pas modifier cela super().__init__('chien')super() intégré retourne un objet proxy, au lieu de l'objet lui-même, qui peut appeler les méthodes de la classe de base par délégation. Cela s'appelle l'indirect (la capacité de super() à se référer à l'objet de base).
Étant donné que l'héritage indirect est calculé au moment de l'exécution, nous pouvons utiliser différentes classes de base à différents moments (si nécessaire).
class Animal: def __init__(self, Animal): print(Animal, 'est un animal'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'est un animal de sang chaud.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "ne peut pas voler.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "ne peut pas nager.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Le chien a4un membre inférieur.');</script> super().__init__('chien') d = Dog() print('') bat = NonMarineMammal('bat')
Résultat de la sortie
Le chien a4un membre inférieur. Le chien ne peut pas nager. Le chien ne peut pas voler. Le chien est un animal de sang chaud. Le chien est un animal Le chauve-souris ne peut pas nager. Le chauve-souris est un animal de sang chaud. Le chauve-souris est un animal
L'ordre de résolution des méthodes (MRO) est l'ordre dans lequel les méthodes doivent être héritées en cas de multiples héritages. Vous pouvez consulter le MRO en utilisant l'attribut __mro__ .
>>> Dog.__mro__ (<class 'Dog'>, <class 'NonMarineMammal'>, <class 'NonWingedMammal'>, <class 'Mammal'>, <class 'Animal'>, <class 'object'>)
Voici comment fonctionne le MRO :
Les méthodes appelées dans les appels dérivés sont toujours appelées avant les méthodes des classes de base.
Dans notre exemple, la classe Dog est appelée avant NonMarineMammal ou NoneWingedMammal. Ces deux classes sont appelées avant Mammal, qui est appelé avant Animal, et la classe Animal est appelée avant l'objet (object).
Si plusieurs classes parentes sont présentes, par exemple Dog (NonMarineMammal, NonWingedMammal) avec plusieurs classes parentes, la méthode NonMarineMammal est appelée en premier, car elle apparaît en premier.