class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def display_info(self):
print(f”Name: {self.name}, Age: {self.age}”)
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def display_student_info(self):
super().display_info()
print(f”Student ID: {self.student_id}”)
# Example usage
student = Student(“John Doe”, 20, “ST12345”)
student.display_student_info()
“`
Python super
Para entender sobre a função super() em Python, é necessário compreender a Herança em Python. Na herança em Python, as subclasses herdam da superclasse. A função super() em Python nos permite referenciar a superclasse implicitamente, facilitando e tornando mais confortável nossa tarefa ao referenciar a superclasse a partir da subclasse. Assim, ao referenciar a superclasse da subclasse, não precisamos escrever explicitamente o nome da superclasse. Nas seções seguintes, discutiremos a função super() em Python.
Exemplo da função super() em Python
Primeiramente, observe o código a seguir que usamos em nosso tutorial sobre Herança em Python. No código de 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 os 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 os 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, conforme 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 é ligeiramente 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 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 mudança está 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 é mais limpa.
Função super do Python com herança multinível
Conforme mencionamos anteriormente, a função super() do Python nos permite referenciar a superclasse implicitamente. Mas, no caso de heranças multiní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 de herança multinível com super do Python 3 acima.
Initializing: class C
Initializing: class B
Initializing: class A
Printing from class C: 1
Printing from class B: 2
Printing from class A: 3
Portanto, a partir da saída, podemos ver claramente que a função __init__()
da classe C foi chamada primeiro, depois a classe B e, após isso, a classe A. Algo semelhante aconteceu ao chamar a função sub_method()
.
Por que precisamos da função super do Python
Se você tem experiência prévia 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 seu programa contém herança de vários níveis, então essa função super() é útil para você. Então, isso é tudo 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 verificar o script completo do Python e mais exemplos de Python em nosso Repositório no GitHub.
Referência: Documentação Oficial
Source:
https://www.digitalocean.com/community/tutorials/python-super