Python super() – Python 3 super()

A função super() do Python nos permite nos referir explicitamente à classe pai. É útil em casos de herança onde queremos chamar funções da classe super.

Python super

Para entender sobre a função super do Python, é necessário conhecer a Herança em Python. Na herança em Python, as subclasses herdam da superclasse. A função super() do Python nos permite nos referir à superclasse implicitamente. Assim, a função super do Python torna nossa tarefa mais fácil e confortável. Ao nos referirmos à superclasse da subclasse, não precisamos escrever o nome da superclasse explicitamente. Nas seções seguintes, discutiremos a função super do Python.

Exemplo da função super do Python

Primeiramente, observe o código a seguir que usamos em nosso tutorial de Herança em Python. No exemplo, a superclasse era Person e a subclasse era Student. O código é mostrado abaixo.

class Person:
    # inicializando as variáveis
    name = ""
    age = 0

    # definindo o construtor
    def __init__(self, person_name, person_age):
        self.name = person_name
        self.age = person_age

        # definindo métodos da classe

    def show_name(self):
        print(self.name)

    def show_age(self):
        print(self.age)


# definição da subclasse começa aqui
class Student(Person):
    studentId = ""

    def __init__(self, student_name, student_age, student_id):
        Person.__init__(self, student_name, student_age)
        self.studentId = student_id

    def get_id(self):
        return self.studentId  # returns the value of student id


# fim da definição da subclasse


# Criar um objeto da superclasse
person1 = Person("Richard", 23)
# chamar métodos membros dos objetos
person1.show_age()
# Criar um objeto da subclasse
student1 = Student("Max", 22, "102")
print(student1.get_id())
student1.show_name()

No exemplo acima, chamamos a função da classe pai como:

Person.__init__(self, student_name, student_age) 

Podemos substituir isso pela chamada da função super do Python como abaixo.

super().__init__(student_name, student_age)

A saída permanecerá a mesma em ambos os casos, como mostrado na imagem abaixo.

Python 3 super

Observe que a sintaxe acima é para a função super do Python 3. Se você estiver nas versões Python 2.x, então é um pouco diferente e você terá que fazer as seguintes alterações:

class Person(object):
...
        super(Student, self).__init__(student_name, student_age)

A primeira alteração é ter object como a classe base para Person. É necessário usar a função super nas versões do Python 2.x. Caso contrário, você receberá o seguinte erro.

Traceback (most recent call last):
  File "super_example.py", line 40, in <module>
    student1 = Student("Max", 22, "102")
  File "super_example.py", line 25, in __init__
    super(Student, self).__init__(student_name, student_age)
TypeError: must be type, not classobj

A segunda alteração na sintaxe da própria função super. Como você pode ver, a função super do Python 3 é muito mais fácil de usar e a sintaxe também é limpa.

Função super do Python com herança de vários níveis

Conforme mencionamos anteriormente, a função super() do Python nos permite referenciar a superclasse implicitamente. Mas, no caso de heranças de vários níveis, a qual classe ela se referirá? Bem, a função super() do Python sempre se referirá à superclasse imediata. Além disso, a função super() do Python não apenas pode referenciar a função __init__(), mas também pode chamar todas as outras funções da superclasse. Portanto, no exemplo a seguir, veremos isso.

class A:
    def __init__(self):
        print('Initializing: class A')

    def sub_method(self, b):
        print('Printing from class A:', b)


class B(A):
    def __init__(self):
        print('Initializing: class B')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class B:', b)
        super().sub_method(b + 1)


class C(B):
    def __init__(self):
        print('Initializing: class C')
        super().__init__()

    def sub_method(self, b):
        print('Printing from class C:', b)
        super().sub_method(b + 1)


if __name__ == '__main__':
    c = C()
    c.sub_method(1)

Vamos ver a saída do exemplo acima de super do Python 3 com herança de vários níveis.

Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3

Assim, a partir da saída, podemos ver claramente que a função __init__() da classe C foi chamada primeiro, depois a classe B e, em seguida, a classe A. Coisa semelhante aconteceu ao chamar a função sub_method().

Por que precisamos da função super do Python

Se você tem experiência anterior na linguagem Java, então você deve saber que a classe base também é chamada por um objeto super lá. Portanto, esse conceito é realmente útil para os programadores. No entanto, o Python também mantém a facilidade para o programador usar o nome da superclasse para se referir a elas. E se o seu programa contiver herança de vários níveis, então essa função super() é útil para você. Então, é isso sobre a função super do Python. Espero que você tenha entendido esse tópico. Por favor, use a caixa de comentários para qualquer dúvida.

Você pode conferir o script completo em Python e mais exemplos de Python em nosso Repositório GitHub.

Referência: Documentação Oficial

Source:
https://www.digitalocean.com/community/tutorials/python-super