2010-01-19 7 views
29

Je suis assez nouveau pour Python en général.Dois-je créer chaque classe dans son propre fichier .py?

Je suis conscient que je peux créer plusieurs classes dans le même fichier .py, mais je me demande si je devrais créer chaque classe dans son propre fichier .py.

En C# par exemple, j'aurais une classe qui gère toutes les interactions de base de données. Puis une autre classe qui avait les règles d'affaires.

Est-ce le cas en Python?

Répondre

25

Non. Le style Python typique consiste à placer des classes liées dans le même module. Il se peut qu'une classe se retrouve dans un module qui lui soit propre (surtout si c'est une grande classe), mais cela ne devrait pas être un objectif en soi. Et quand vous le faites, s'il vous plait ne nommez pas le module après la classe - vous finirez par vous confondre avec d'autres et sur ce qui est qui.

+4

En venant de Java j'ai eu cette même question, mon garçon était confus pendant un moment. :-) – snarkyname77

+0

Fait intéressant, PyDev vous donne la possibilité de faire exactement cela. – Uri

+0

Si vous importez une classe à partir d'un fichier avec plusieurs classes, l'interpréteur n'exécuterait-il pas toutes les classes de ce fichier? –

8

Chaque fichier .py représente un module, vous devez donc conserver les groupes logiques de fonctions, de constantes et de classes dans le même fichier.

Chaque classe dans un fichier .py va simplement créer ballonnement épique dans votre table de module, car si vous n'êtes intéressé que par une seule classe, vous pouvez toujours

from whatever import SomeClass 
+7

Le style Python utilise généralement 'lowercase' pour les noms de modules et' CapWords' pour les noms de classes: http://www.python.org/dev/peps/pep-0008/ –

+0

Vous avez absolument raison Greg, je vais modifier. – richo

+0

Parfois, les styles sont stupides. Si vous avez une classe Foo, allez-y et mettez-la dans le module Foo.py. Pourquoi voudriez-vous le mettre en minuscule foo.py? Donc vous pouvez écrire 'depuis foo import Foo'? En écrivant '__all__ = ['Foo']' dans le module, vous pouvez taper 'from foo import 'ou' from Foo import' 'et il n'y aura pas de confusion. Les noms de modules en minuscules sont stupides s'ils ne contiennent qu'une seule classe. –

1

Probablement pas. Les fichiers Python sont des "modules". Les modules doivent contenir juste quel code est indépendamment réutilisable. Si cela comprend plusieurs classes, ce qui est la norme, alors c'est parfaitement correct.

3

Un autre point à mentionner est que si un fichier devient trop volumineux, vous pouvez toujours le transformer en un paquet, ce qui facilite la réorganisation sans casser le code du client.

+0

Un package est simplement plusieurs fichiers (plusieurs modules). Donc, votre réponse est essentiellement de dire que oui, chaque classe devrait aller dans son propre fichier (module) quand la quantité de code devient trop grande. –

2

Je ne suis pas d'accord avec les autres et je dis oui. Pour ma part, j'ai eu plus de succès en plaçant chaque classe dans son propre fichier (module). Mais il y a des exceptions alors laissez-moi vous expliquer avec un exemple.

Si vous avez une classe Foo, puis le mettre dans un fichier appelé Foo.py, avec les sections suivantes:

  1. Imports
    • C'est là que vous tirez dans les dépendances.
    • Exemples: import math, from Bar import *
  2. Globals
    • C'est là que vous définissez l'interface externe à votre module, qui sont tous les symboles qui sont visibles à l'extérieur de ce module.
    • Exemple: __all__ = ['Foo']
    • C'est également ici que vous pouvez définir des variables globales (mauvaises) et des constantes globales (bonnes). Ces globals n'ont pas besoin d'être exportés; ils peuvent être rendus globaux simplement pour simplifier le code.
    • Exemple: PI = 3.14159 signifie que vous pouvez écrire PI, alors que si vous l'avez défini dans la classe Foo, vous devrez écrire Foo.PI.
  3. Fonctions
    • C'est là que vous définissez toutes les fonctions de haut niveau qui sont pertinentes à la classe Foo, mais ne fait pas partie de l'espace de noms de classe Foo. Ceux-ci sont probablement rares puisque les classes autorisent à la fois @staticmethods et les classes internes.
    • Exemple: def print_foo(foo): print(foo)
  4. Classes
    • Exemple: class Foo(object): pass

Parfois, vous voulez placer plus d'une classe dans le même module. Vous devriez le faire chaque fois que deux classes ou plus sont conceptuellement liées au point où vous les utiliseriez presque toujours ensemble et jamais de façon indépendante. C'est l'exception, pas la norme. Dans ce cas, ajoutez tous les noms de classe au __all__ global. Enfin, pour chaque module Foo.py, il devrait y avoir un module de test unitaire correspondant appelé testFoo.py.

1

Oui chaque classe dans son propre fichier. Importer même une seule classe (ou fonction) dans un fichier avec plusieurs classes oblige python à exécuter la définition de toutes les classes du fichier. Essayez ceci:

manyClass.py

class foo(): 
    print 'a bunch of time consuming work' 

class tryme(): 
    print 'try me' 

Maintenant, tapez ceci dans le shell interprète ...

de manyClasses importer Tryme

un tas de temps de travail
me essayer

Questions connexes