2010-10-01 6 views
53

J'aime la convention Java d'avoir une classe publique par fichier, même s'il y a parfois de bonnes raisons de placer plus d'une classe publique dans un seul fichier. Dans mon cas, j'ai des implémentations alternatives de la même interface. Mais si je les placer dans des fichiers séparés, j'ai des noms redondants dans les déclarations d'importation (ou noms de modules trompeurs):Organisation de classes Python dans des modules et/ou des packages

import someConverter.SomeConverter 

alors someConverter serait le fichier (module) nom et SomeConverter le nom de classe . Cela me semble assez inélégant. Pour mettre toutes les classes alternatives dans un seul fichier conduirait à une déclaration d'importation plus significative:

import converters.SomeConverter 

Mais je crains que les fichiers deviennent assez gros, si je mets toutes les classes associées dans un seul fichier de module. Quelle est la meilleure pratique de Python ici? Une classe par fichier est-elle inhabituelle?

+7

au moment où vous avez affaire à un projet composé de 10'000 cours, vous serez heureux si vous pouvez trouver un nom de classe (public) par son fichier (et package) au lieu de devoir chercher dans le contenu d'un Il est probablement la raison pour laquelle Java impose qu'il n'y a qu'une seule classe publique par fichier et que le nom du fichier doit être le nom de la classe. –

Répondre

55

Beaucoup de choses sont des préférences personnelles. En utilisant des modules de python, vous avez la possibilité de garder chaque classe dans un fichier séparé et laisser encore import converters.SomeConverter (ou from converters import SomeConverter)

Votre structure de fichier pourrait ressembler à ceci:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

puis dans votre fichier __init__.py:

from baseconverter import BaseConverter 
from otherconverter import OtherConverter 
36

pauses solution de Zach sur Python 3. Voici une solution fixe.

Une grande partie est une préférence personnelle. En utilisant des modules de python, vous avez la possibilité de garder chaque classe dans un fichier séparé et laisser encore import converters.SomeConverter (ou from converters import SomeConverter)

Votre structure de fichier pourrait ressembler à ceci:

* converters 
    - __init__.py 
    - baseconverter.py 
    - someconverter.py 
    - otherconverter.py 

puis dans votre __init__.py fichier:

from converters.baseconverter import BaseConverter 
from converters.otherconverter import OtherConverter 
+1

Que diriez-vous juste "de .baseconverter import BaseConverter"? –

+0

Désolé pour le suivi en retard, j'ai été hors contact avec python ces derniers temps, si quelqu'un peut vérifier la solution de Michael ci-dessus alors s'il vous plaît n'hésitez pas à modifier ma réponse et l'ajouter comme alternative. (Ne changez pas mon original parce que je pense que c'est une question de préférence quant à celui qui semble plus lisible donc donnons aux utilisateurs les deux options) – Spundun

+6

La réponse de Michael fonctionne, mais PEP 8 décourage les importations relatives. http://stackoverflow.com/questions/4209641/absolute-vs-explicit-relative-import-of-python-module –

Questions connexes