crie classes de produtos para crianças, uma para cada tipo de produto: ElectricalProduct, ElectronicProduct e MechanicalProduct. Como essas classes não diferem umas das outras em métodos ou membros - já definidas na classe pai - elas estariam todas vazias.
Eu considero a segunda opção uma abordagem melhor, mas é o caminho certo? Eu nunca vi tal coisa em qualquer aplicativo ou biblioteca.
Agora que você explicou mais detalhadamente, parece que realmente não há lógica específica para subclasses. Nesse caso, a herança não é a escolha certa. Se realmente existem apenas maneiras pequenas em que outras partes do código tratam os produtos, colocar o código nas classes de produto seria errado - uma violação da separação de interesses que sobrecarregaria as classes de produto com o conhecimento de outras partes do sistema. O exemplo de classificação deixa isso claro. Os produtos não devem saber como são classificados, armazenados ou apresentados; se o código que classifica ou apresenta objetos for alterado, a classe do produto não precisará ser reescrita.
Peço desculpas por duvidar de você sobre isso. Vemos tantas pessoas aqui apresentando perguntas baseadas em conhecimentos inadequados de OO, e presumi que esse era o caso quando eu deveria ter solicitado mais informações primeiro.
A opção de sobrecarga de método, conforme mostrado em seu código de exemplo, está realmente indo contra princípios como a separação de interesses e DRY. Qual é a coisa comum sobre o método add_product ? Adiciona um produto à coleção apropriada. Mas no código de exemplo, essa única tarefa fundamentalmente idêntica é duplicada em três locais diferentes. Isso realmente não é muito diferente de uma cadeia de lógica if..then..else .