Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Também não entendi porque a class Hipster entende o self.nome iniciado em class Funcionario.

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?

1 resposta
solução!

Olá!

1. 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?

Quando você acessa um método ou atributo em uma instância de uma classe, o Python começa procurando no próprio objeto (self). Se não encontrar, ele começa a procurar nas classes da qual a classe atual herda, seguindo a ordem definida na herança.

No exemplo dado, quando você cria uma instância da classe Pleno e chama o método __str__, o Python vai verificar primeiro na classe Alura (pois é a primeira classe na ordem de herança), depois na classe Caelum, e por último, na classe Hipster.

2. E também fiquei na dúvida com relação à ordem.

Sim, a ordem de herança é crucial. A classe Pleno herda primeiro de Alura, depois de Caelum e, por último, de Hipster. Isso determina a ordem em que o Python buscará métodos e atributos.

3. 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?

Correto. Se a classe Hipster tivesse um método __init__ que inicializasse self.nome, e se esse método __init__ fosse chamado (o que só ocorreria se Hipster fosse a primeira classe na lista de herança), então aquele valor seria utilizado. No entanto, como a classe Hipster é a última na lista de herança, o self.nome que ele utiliza é o definido pela classe Funcionário, pois essa é a ordem em que o Python procura.

A ordem de herança é fundamental para determinar de qual classe um método ou atributo será herdado, e o Python segue essa ordem estritamente ao buscar esses métodos ou atributos.