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!