Question

Je viens d'un contexte dans lequel je crée normalement un fichier par classe. J'organise aussi des cours communs sous répertoires. Cette pratique est intuitive pour moi et il s’est avéré efficace en C ++, PHP, JavaSript, etc.

Je n'arrive pas à intégrer cette métaphore dans Python: les fichiers ne sont plus simplement des fichiers, mais des modules formels. Il ne semble pas juste d'avoir une seule classe dans un module - la plupart des classes sont inutiles par elles-mêmes. Si j’ai un automobile.py et une classe Automobile , il semble ridicule de toujours le référencer en tant que automobile.Automobile .

Mais, en même temps, il ne semble pas correct de jeter une tonne de code dans un fichier et de l'appeler un jour. Évidemment, une application très complexe devrait avoir plus de 5 fichiers.

Quelle est la manière correcte - ou pythonique ---? (Ou s’il n’ya pas de méthode correcte, quelle est votre méthode préférée et pourquoi?) Combien de code devrais-je utiliser dans un module Python?

Était-ce utile?

La solution

Pensez en termes d'une "unité logique d'emballage". - qui peut être une classe unique, mais sera plus souvent un ensemble de classes qui coopèrent étroitement. Les classes (ou les fonctions de niveau module - ne faites pas "Java en Python" en utilisant toujours des méthodes statiques lorsque des fonctions de niveau module sont également disponibles en tant que choix! -) peuvent être regroupées en fonction de ce critère. Fondamentalement, si la plupart des utilisateurs de A ont également besoin de B et inversement, A et B devraient probablement être dans le même module; mais si de nombreux utilisateurs n'ont besoin que de l'un d'eux et non de l'autre, ils doivent probablement se trouver dans des modules distincts (peut-être dans le même package, c'est-à-dire un répertoire contenant un fichier __ init __. py ).

La bibliothèque Python standard, bien que loin d’être parfaite, a tendance à refléter (généralement) des pratiques raisonnablement bonnes - vous pouvez donc en tirer des enseignements par exemple. Par exemple, le module threading du cours définit une classe Thread ... mais il contient également les classes primitives de synchronisation telles que les verrous, les événements, les conditions et les sémaphores, ainsi qu'une classe d'exception qui peut être levée par des opérations de threading (et quelques autres choses). Il se situe à la limite supérieure de la taille raisonnable (800 lignes, y compris les espaces et les docstrings), et certaines fonctionnalités cruciales liées aux threads, telles que Queue, ont été placées dans un module séparé. pour emballer dans un seul module.

Autres conseils

Si vous souhaitez vous en tenir à votre système à une classe par fichier (ce qui est logique, ne vous méprenez pas, vous pouvez le faire de cette manière pour éviter de vous référer à automobile.Automobile :

from automobile import Automobile
car = Automobile()

Cependant, comme mentionné par cobbal, plus d’une classe par fichier est assez commune en Python. Quoi qu’il en soit, tant que vous choisissez un système sensé et que vous l’utilisez de manière cohérente, je ne pense pas que les utilisateurs de Python vont se fâcher contre vous:).

Si vous venez d'un point de vue c ++, vous pouvez afficher des modules python similaires à un fichier .so ou .dll. Oui, ils ressemblent à des fichiers sources, car python est écrit dans un script, mais ce sont en fait des bibliothèques chargeables dotées de fonctionnalités spécifiques.

Une autre métaphore qui peut aider est que vous pouvez regarder les modules python comme des espaces de noms.

Dans un projet de taille moyenne, je me suis retrouvé avec plusieurs ensembles de classes étroitement liées. Plusieurs de ces ensembles sont maintenant regroupés dans des fichiers; par exemple, les classes de réseau de bas niveau sont toutes dans un seul module network . Cependant, quelques-unes des plus grandes classes ont été réparties dans leur propre fichier.

Peut-être que le meilleur moyen de démarrer ce chemin à partir d'un historique d'une classe par fichier est de prendre les classes que vous placeriez normalement dans le même répertoire et de les conserver dans le même fichier. Si ce fichier semble trop volumineux, séparez-le.

Comme une vague directive: plus d'une classe par fichier est la norme pour python

Voir aussi Combien de classes Python devrais-je mettre dans un fichier?

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