Question

J'ai des problèmes pour structurer les classes dans la partie modèle d'un modèle MVC dans mon application Python. Peu importe comment je tourne les choses, je continue à courir dans les importations circulaires. Voici ce que j'ai:

Modèle / __ init__p.y

  • doit contenir tous les noms de classe Model afin Je peux effectuer un " à partir d'un utilisateur importateur de modèle " par exemple. à partir d'un contrôleur ou d'une unité cas de test

Model / Database.py

  • contient la classe de base de données
  • doit importer toutes les classes du modèle pour faire de l'ORM
  • l'initialisation doit être effectuée lors de la première importation de module, c.-à-d. aucun appel ou instanciation supplémentaire (toutes les méthodes de la classe Database sont des @classmethods)

Modèle / Utilisateur.py

  • contient la classe de modèle utilisateur
  • a besoin d'accéder à la classe de base de données pour effectuer des requêtes
  • doit hériter de la classe de base commune à toutes les classes Model pour partager les fonctionnalités (méthodes de persistance de la base de données, code de validation des paramètres, etc.)

Je n'ai pas encore vu d'application Python du monde réel utilisant MVC. Mon approche est donc probablement non pythonique (et peut-être un désordre lié à une langue en plus ...) - des suggestions sur la façon de résoudre ce problème?

Merci Simon

Était-ce utile?

La solution

Il y a une incohérence dans vos spécifications. Vous dites que Database.py doit importer toutes les classes Model pour effectuer ORM, mais vous dites ensuite que la classe User doit accéder à la base de données pour effectuer des requêtes.

Pensez à ceux-ci en tant que couches d'une API. La classe Database fournit une API (éventuellement orientée objet) à une couche de persistance physique (telle que DB-API 2.0). Les classes Model, comme User, utilisent la couche Base de données pour charger et enregistrer leur état. Il n'y a aucune raison pour que la classe Database.py importe toutes les classes Model. En fait, vous ne voudriez pas cela, car vous auriez à modifier Database.py à chaque fois que vous créez une nouvelle classe Model - qui est une odeur de code. .

Autres conseils

En règle générale, nous mettons tout cela dans un seul fichier. Ce n'est pas Java ou C ++.

Commencez avec un seul fichier jusqu'à ce que vous obteniez plus d'expérience avec Python. À moins que vos fichiers ne soient gargantues, cela fonctionnera bien.

Par exemple, Django encourage ce style, alors copiez sa formule pour réussir. Un module pour le modèle. Un module pour chaque application; chaque application importe un modèle commun.

Les éléments de votre base de données et de votre super-classe peuvent figurer dans votre fichier __ init __. py , car ils s’appliquent à l’ensemble du package. Cela pourrait réduire une partie de la circularité.

Je pense que vous avez un problème qui devrait être corrigé. Les références circulaires résultent souvent d’un manque de séparation des préoccupations. À mon avis, les modules de base de données et de modèle ne devraient pas se connaître beaucoup, travaillant plutôt avec une API. Dans ce cas, la base de données ne doit pas référencer directement une classe de modèle spécifique, mais fournir la fonctionnalité que les classes de modèle devront fonctionner. Le modèle, à son tour, devrait obtenir une référence de base de données (injectée ou demandée) qu’il utiliserait pour interroger et se conserver.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top