Olha, criar High Order Classes é uma forma de se atingir herança horizontal em linguagens que suportam isso, inclusive acredito que Python suporte isso nativamente o que torna um pouco sem sentido criar uma High Order Class, e se herança vertical já não é bem vista, a horizontal tem uma reputação ainda pior, inclusive um bom motivo para herança num geral não ter uma boa reputação é quando você consegue utilizar as duas ao mesmo tempo, pois isso pode acabar levando ao que as pessoas chamam de problema do diamante.

A princípio herança seja ela qual for é uma técnica válida de reúso de código, porém com certeza essa não seria a minha recomendação para resolver um problema.

Eu não sou da comunidade python, então não faço ideia de como seria algo idiomático para um programador python, entretanto dei uma olhada nessa lib Marshmellow, e me parece algo como o Zod do JS com umas baterias a mais.

Olhando o exemplo que tem na doc dele me parece que eles tem uma solução oficial para a criação dos Schemas: https://marshmallow-sqlalchemy.readthedocs.io/en/latest/recipes.html#automatically-generating-schemas-for-sqlalchemy-models

Agora pensando em uma boa arquitetura, mesmo que os dados sejam os mesmos entre várias classes, você não deveria ficar tentado a compartilhar eles por qualquer meio que seja, ainda mais herança que vai gerar um acoplamento enorme. Isso só deve acontecer se ambas as classes mudarem pelos mesmos motivos, senão apesar de parecerem iguais no início, conforme o tempo for passando, elas vão terminar muito diferentes uma da outra, e esse acoplamento inicial feito para reaproveitar o código é o que vai estar segurando uma de evoluir independente da outra.

Quanto ao problema de sentir que muitas classes são iguais/repetidas, isso provavelmente se deve a criação de abstrações desnecessárias. Seu projeto provavelmente deve ser tão simples que acaba por ter um modelo anêmico, e portanto ter algumas abstrações extras (um dos 4 esteriotipos de classes) pode acabar por apenas servir para repetir o código enquanto causa alguma indireção, sem agregar algo de fato ao projeto, sendo um problema de overeengenering.

Claro que como arquitetos gostamos de deixar nossas opções abertas para o futuro, mas criar abstrações demais no início pode ser um problema tão grande quanto a falta delas no longo prazo.

Caraca, que resposta completa.

Realmente, passei batido por essa parte da documentação. Parece resolver meu problema, mas acho que vou dar um passo para trás e me atentar à questão do excesso de complexidade. O que você falou faz bastante sentido.

Obrigado pela ajuda! :)