Sobrescrevendo Funcionalidades da Classe Base - Python
Para entender como uma classe derivada pode herdar e modificar funcionalidades de uma classe base, vamos considerar o seguinte exemplo. Suponha que temos uma classe Person
Employee
Person
Person
class Person:
def __init__(self, name):
self.__name = name # nome da pessoa
@property
def name(self):
return self.__name
def display_info(self):
print(f"Name: {self.__name}")
class Employee(Person):
def work(self):
print(f"{self.name} works")
Mas e se quisermos modificar algumas dessas funcionalidades? Por exemplo, podemos desejar adicionar um novo atributo ao funcionário no construtor para armazenar a empresa onde ele trabalha ou alterar a implementação do método display_info
Vamos modificar as classes da seguinte forma:
class Person:
def __init__(self, name):
self.__name = name # nome da pessoa
@property
def name(self):
return self.__name
def display_info(self):
print(f"Name: {self.__name}")
class Employee(Person):
def __init__(self, name, company):
super().__init__(name)
self.company = company
def display_info(self):
super().display_info()
print(f"Company: {self.company}")
def work(self):
print(f"{self.name} works")
tom = Employee("Tom", "Microsoft")
tom.display_info() # Name: Tom
# Company: Microsoft
Aqui, a classe Employee
self.company
__init__()
__init__
Employee
Person
Para acessar a classe base, utilizamos a expressão super()
Employee
super().__init__(name)
Essa expressão chama o construtor da classe Person
Person
Employee
company
Além disso, na classe Employee
display_info()
def display_info(self):
print(f"Name: {self.name}")
print(f"Company: {self.company}")
No entanto, essa abordagem duplicaria a linha de código para exibir o nome, que já existe na classe Person
super()
display_info
Person
def display_info(self):
super().display_info() # chama display_info da classe Person
print(f"Company: {self.company}")
Assim, podemos criar um objeto Employee
display_info
tom = Employee("Tom", "Microsoft")
tom.display_info()
O resultado será:
Name: Tom Company: Microsoft
Verificação de Tipo do Objeto
Ao trabalhar com objetos, pode ser necessário realizar operações específicas com base no tipo do objeto. Com a função isinstance()
isinstance(objeto, tipo)
O primeiro parâmetro representa o objeto, e o segundo é o tipo para o qual a verificação é feita. Se o objeto for do tipo especificado, a função retorna True
Person-Employee
Student
class Person:
def __init__(self, name):
self.__name = name # nome da pessoa
@property
def name(self):
return self.__name
def do_nothing(self):
print(f"{self.name} does nothing")
# classe Employee
class Employee(Person):
def work(self):
print(f"{self.name} works")
# classe Student
class Student(Person):
def study(self):
print(f"{self.name} studies")
def act(person):
if isinstance(person, Student):
person.study()
elif isinstance(person, Employee):
person.work()
elif isinstance(person, Person):
person.do_nothing()
tom = Employee("Tom")
bob = Student("Bob")
sam = Person("Sam")
act(tom) # Tom works
act(bob) # Bob studies
act(sam) # Sam does nothing
Aqui, a classe Employee
work()
study()
A função act
isinstance
person