Composição vs Herança
Em código real, sistemas evoluem constantemente. Se você usar herança para relacionar um carro ao motor (herdar Motor em Carro), qualquer mudança no motor pode quebrar o carro. Já a composição (Carro tem um Motor) permite trocar o motor sem afetar a estrutura do carro. Dominar composição evita acoplamento frágil e facilita manutenção.
O PROBLEMA
Motor e Carro com composição (Carro tem Motor). Compare com herança.
EXEMPLO
Carro("Ferrari", Motor(200,"V8")).motor.potencia → 200SOBRE O CONCEITO
Composição significa que uma classe contém uma instância de outra como atributo. O erro comum é usar herança (class Carro(Motor)) quando na verdade o carro tem um motor, não é um motor. Herança força o carro a herdar todos os métodos do motor, inclusive os que não fazem sentido (como acelerar_motor). Com composição, você define explicitamente que Carro possui um atributo self.motor e acessa self.motor.potencia. Assim, a relação é mais precisa e o código fica mais flexível para mudanças futuras.
RESOLUÇÃO