O super () embutido retorna um objeto proxy (objeto temporário da superclasse) que nos permite acessar métodos da classe base.
Em Python, super()
tem dois casos de uso principais:
- Nos permite evitar o uso do nome da classe base explicitamente
- Trabalho com herança múltipla
Exemplo 1: super () com herança única
No caso de herança única, permite-nos referir a classe base por super()
.
class Mammal(object): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') class Dog(Mammal): def __init__(self): print('Dog has four legs.') super().__init__('Dog') d1 = Dog()
Resultado
O cachorro tem quatro pernas. O cão é um animal de sangue quente.
Aqui, chamamos o __init__()
método da classe Mammal (da classe Dog) usando o código
super () .__ init __ ('Cachorro')
em vez de
Mamífero .__ init __ (próprio, 'Cachorro')
Visto que não precisamos especificar o nome da classe base quando chamamos seus membros, podemos facilmente alterar o nome da classe base (se necessário).
# changing base class to CanidaeFamily class Dog(CanidaeFamily): def __init__(self): print('Dog has four legs.') # no need to change this super().__init__('Dog')
O super()
builtin retorna um objeto proxy, um objeto substituto que pode chamar métodos da classe base por meio de delegação. Isso é chamado de indireção (capacidade de fazer referência a um objeto de base super()
)
Visto que a indireção é calculada no tempo de execução, podemos usar diferentes classes base em momentos diferentes (se necessário).
Exemplo 2: super () com herança múltipla
class Animal: def __init__(self, Animal): print(Animal, 'is an animal.'); class Mammal(Animal): def __init__(self, mammalName): print(mammalName, 'is a warm-blooded animal.') super().__init__(mammalName) class NonWingedMammal(Mammal): def __init__(self, NonWingedMammal): print(NonWingedMammal, "can't fly.") super().__init__(NonWingedMammal) class NonMarineMammal(Mammal): def __init__(self, NonMarineMammal): print(NonMarineMammal, "can't swim.") super().__init__(NonMarineMammal) class Dog(NonMarineMammal, NonWingedMammal): def __init__(self): print('Dog has 4 legs.'); super().__init__('Dog') d = Dog() print('') bat = NonMarineMammal('Bat')
Resultado
O cão tem 4 patas. O cão não sabe nadar. O cão não pode voar. O cão é um animal de sangue quente. O cachorro é um animal. O morcego não sabe nadar. O morcego é um animal de sangue quente. O morcego é um animal.
Pedido de resolução de método (MRO)
A Ordem de Resolução de Método (MRO) é a ordem na qual os métodos devem ser herdados na presença de herança múltipla. Você pode visualizar o MRO usando o __mro__
atributo.
>>> Cachorro .__ mro__ (,,,,,)
Veja como funciona o MRO:
- Um método nas chamadas derivadas é sempre chamado antes do método da classe base.
Em nosso exemplo, a classe Dog é chamada antes de NonMarineMammal ou NoneWingedMammal. Essas duas classes são chamadas antes de Mammal, que é chamado antes de Animal, e a classe Animal é chamada antes do objeto. - Se houver vários pais como
Dog(NonMarineMammal, NonWingedMammal)
, os métodos de NonMarineMammal são invocados primeiro porque aparecem primeiro.
Para saber mais sobre super()
, visite o super () considerado super!