Eu li a resposta dada ao Guilherme mas continuo sem entender.
O Código do exemplo:
class Funcionario:
def __init__(self, nome):
self.nome = nome
def registra_horas(self, horas):
print('Horas registradas.')
def mostrar_tarefas(self):
print('Fez muita coisa...')
class Caelum(Funcionario):
def mostrar_tarefas(self):
print('Fez muita coisa, Caelumer')
def busca_cursos_do_mes(self, mes=None):
print(f'Mostrando cursos - {mes}' if mes else 'Mostrando cursos desse mês')
class Alura(Funcionario):
def mostrar_tarefas(self):
print('Fez muita coisa, Alurete!')
def busca_perguntas_sem_resposta(self):
print('Mostrando perguntas não respondidas do fórum')
class Junior(Alura):
pass
class Hipster:
def __str__(self):
return f'Hipster, {self.nome}'
class Pleno(Alura, Caelum, Hipster):
pass
luan = Pleno('Luan')
print(luan)
O que entendi:
luan é um objeto da classe Pleno e herda os métodos: mostrar_tarefas e busca_perguntas_sem_resposta da classe Alura; mostrar_tarefas e busca_cursos_do_mes da classe Caelum; e o método str (que utiliza o atributo self.nome) da classe Hipster.
Minha dúvida é como o Python entende que um atributo usado num método de uma classe deve ser buscado na classe mãe de outra classe do mesmo objeto?
E também fiquei na dúvida com relação à ordem.
Foi falado que a ordem de herança é Alura, Caelum e Hipster. Isso significa que, ao procurar por um atributo ou método em uma instância da classe Pleno, o interpretador Python verificará primeiro a classe Alura, depois Caelum e, finalmente, Hipster.
Isso ocorreria mesmo que a classe Hipster tivesse um método init que inicializasse self.nome? Mesmo a classe Hipster inicializando um self.nome, o self.nome utilizado nela não seria aquele por ela inicializado e sim o inicializado na classe Funcionários, é isso?