Super Python ()

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!

Artigos interessantes...