Pergunta

Estou tendo problemas aulas estruturantes na parte Modelo de um padrão MVC em meu aplicativo Python. Não importa como eu mudar as coisas, eu continuo correndo em importações circulares. Aqui está o que eu tenho:

Modelo / __ init__p.y

  • deve conter todos os nomes de classe Modelo de forma Eu posso fazer um "do Modelo de usuário de importação" por exemplo. a partir de um controlador ou uma unidade caso de teste

Modelo / Database.py

  • segura uma classe de banco de dados
  • precisa importar todas as classes de modelo para fazer ORM
  • inicialização deve ser realizada na primeira importação módulo, ou seja, nenhuma chamada de inicialização extra ou instantiations (todos os métodos de classe de banco de dados são @classmethods)

Modelo / User.py

  • contém classe modelo User
  • precisa de acesso a classe de banco de dados para fazer consultas
  • deve herdar comum classe base para todas as classes de modelo para a funcionalidade de compartilhamento (métodos de persistência de banco de dados, código de validação de parâmetros etc.)

Ainda estou para ver um Python aplicativo mundo real empregando MVC, por isso a minha abordagem é provavelmente un-Pythonic (e, possivelmente, uma confusão de linguagem agnóstico em cima disso ...?) - alguma sugestão sobre como resolver este

Obrigado, Simon

Foi útil?

Solução

Há uma inconsistência em sua especificação. Você diz Database.py precisa importar todas as classes de modelo para fazer ORM mas depois você diz que o acesso necessidade classe de usuário ao banco de dados para fazer consultas.

Pense neles como camadas de uma API. A classe de base de dados oferece uma API (talvez-objeto orientados) para alguns camada persistência física (tal como DB-API 2,0). As classes de modelo, como usuário, use a camada de banco de dados para carregar e salvar seu estado. Não há nenhuma razão para a classe Database.py importar todas as classes de modelo, e na verdade você não iria querer isso porque você teria que modificar Database.py cada vez que você criou uma nova classe Model - que é um cheiro de código .

Outras dicas

Geralmente, colocamos tudo em um arquivo. Este não é Java ou C ++.

Comece com um único arquivo até chegar um pouco mais de experiência com Python. A menos que seus arquivos estão gigantesco, ele vai funcionar bem.

Por exemplo, Django encoraja esse estilo, assim copiar sua fórmula para o sucesso. Um módulo para o modelo. Um módulo para cada aplicação; Cada aplicação importações de um modelo comum.

Seu banco de dados e superclasse coisas podem estar em seu arquivo __init__.py, uma vez que se aplica a todo o pacote. Isso pode reduzir alguns dos circularidade.

Eu acho que você tem uma questão que deve ser endireitado. referências circulares, muitas vezes resultar de uma falha para conseguir a separação de preocupações. Na minha opinião, os módulos de banco de dados e modelo não deve saber muito sobre o outro, trabalhando contra uma API em seu lugar. Neste caso, o banco de dados não deve fazer referência directamente quaisquer classes de modelo específico, mas sim fornecer a funcionalidade das classes de modelo terá de função. O modelo, por sua vez, deve obter uma referência de banco de dados (injetado ou solicitada) que iria usar para consulta e persistem em si.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top