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

Na Herança, posso escolher atributos a serem passados para a SubClasse?

Gostaria de entender se quando uma subclasse herda atributos através de super(), ela deve receber todos atributos da superclasse, ou posso escolher quais atributos repassar para a sub? Exemplo: No caso eu não repassei o atributo tela_tradicional para PcGamer, pois ele possui o atributo próprio tela_grande. Devo manter ou excluir tela_tradicional? (existirão outras classes com o atributo tela_tradicional)

class ComputadorBasico:
    def __init__(self, marca, memoria_ram, tela_tradicional):
        self.marca = marca
        self.memoria_ram = memoria_ram
        self.tela_tradicional = tela_tradicional

class PcGamer(ComputadorBasico):
    def __init__(self, tela_grande, placa_de_video, controle_gamer):
        super().__init__(marca, memoria_ram)
        self.tela_grande = tela_grande
        self.placa_de_video = placa_de_video
        self.controle_gamer = controle_gamer

class PcTrabalho(ComputadorBasico):
    def __init__(self, login_multiplo):
        super().__init__(marca, memoria_ram, tela_tradicional)
        self.login_multiplo = login_multiplo
2 respostas
solução!

Oi Rodrigo,

A Subclasse sempre herda todos os métodos e atributos da Superclasse. Dizer que "uma classe A é filha de outra classe B" significa dizer que A é um tipo específico de B. Todas as instâncias da classe A também são instâncias da classe B.

Imagine uma classe Veiculo, com os atributos placa, ano_fabricacao e renavam. Você pode aproveitá-la para fazer uma subclasse Moto com atributo cilindradas e outra subclasse Carro com numero_de_portas.

Essas duas subclasses também terão os atributos placa, ano_fabricacao e renavam. Você pode confirmar que um objeto carro é um veículo chamando a built-in function isinstance():

print(isinstance(carro, Veiculo))
# >>> True

Para usar o seu exemplo: Quando você diz que "a classe PcGamer é filha da classe ComputadorBasico" significa que PcGamer é um tipo de ComputadorBasico e, portanto, tem todos os seus atributos. Se ComputadorBasico tem marca, memoria_ram e tela_tradicional, então PcGamer também vai ter.

Para manter a herança de classe você é obrigado a chamar a função __init__ da classe pai, e para isso vai precisar fornecer todos os argumentos obrigatórios. É por esse motivo que o seu código dá erro na linha 9: "TypeError: __init__() missing 1 required positional argument: 'tela_tradicional'".

Parece que esse não é o comportamento que você deseja. Talvez seja útil criar uma classe TelaBasica, e a TelaGrande ser uma subclasse dela.

class TelaBasica:
    # implementação

class TelaGrande(TelaBasica):
    # implementação

class ComputadorBasico:
    def __init__(self, marca, memoria_ram, tela_tradicional: TelaBasica):
        self.marca = marca
        self.memoria_ram = memoria_ram
        self.tela_tradicional = tela_tradicional

class PcGamer(ComputadorBasico):
    def __init__(self, tela_grande: TelaGrande, placa_de_video, controle_gamer):
        super().__init__(marca, memoria_ram, tela_grande)
        self.tela_grande = tela_grande
        self.placa_de_video = placa_de_video
        self.controle_gamer = controle_gamer

class PcTrabalho(ComputadorBasico):
    def __init__(self, login_multiplo):
        super().__init__(marca, memoria_ram, tela_tradicional: TelaBasica)
        self.login_multiplo = login_multiplo

Erik, excelente resposta, super completa! Tirou minha dúvida.