Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Atributo self.nome e parâmetro nome

Boa noite, pessoal. Tudo bem? Fiquei com uma dúvida no vídeo Mixins: por que o objeto str da classe Hipster não precisou do parâmetro nome mesmo ela não mesmo esta classe não tendo como parâmetro a classe Funcionario?

class Funcionario:
    def __init__(self, nome):
        self.nome = nome

class Hipster:
    def __str__(self):
        return f'Hipster, {self.nome}'

Acho que não entendi direito o conceito de Mixin... Teria alguma outra fonte para recomendar?

2 respostas
solução!

Boa noite Carlos, os métodos __init__ e __str__ fazem coisas diferentes, o init é um inicializador/construtor da classe, nele você define os valores iniciais da sua instância e realiza algumas ações para a inicialização dessa instância, já o str define o comportamento ao "printar" sua instância ou o comportamento ao usar o método str(nome_da_instancia).

Para exemplificar, digamos que você tenha a seguinte classe:

class Hipster:
    def __init__(self, nome):
        self.nome = nome

    def __str__(self):
        return f'Hipster, {self.nome}'

Depois disso você cria uma instância, ao instanciar você estará acessando o método __init__:

hipster = Hipster('Carlos')

Agora se tentarmos imprimir essa instância, acessaremos o método __str__ da classe:

print(hipster)

A saída final no console será Hipster, Carlos.

Sendo assim, as duas classes escritas da forma como você mostrou não fariam sentido, pois a classe Hispter em momento algum herda da classe Funcionario.

Para funcionar corretamente as classes precisariam ser definidas da seguinte forma:

class Funcionario:
    def __init__(self, nome):
        self.nome = nome

class Hipster(Funcionario):
    def __str__(self):
        return f'Hipster, {self.nome}'

Assim, ao fazer o seguinte código:

hispter = Hipster('Carlos')
print(hispter)

A saída seria exatamente a mesma da classe Hipster do primeiro exemplo: Hipster, Carlos.

Se você tentasse executar o código acima com as classes definidas da maneira como você mostrou, isso resultaria em um erro na criação da instância da classe Hipster, pois não existiria nenhum construtor que receberia um parâmetro nome.

Esperto ter ajudado!

Muito obrigado pela explicação, Helvio!