2010-01-19 11 views
29

Soy bastante nuevo en Python en general.¿Debo crear cada clase en su propio archivo .py?

Soy consciente de que puedo crear varias clases en el mismo archivo .py, pero me pregunto si debería crear cada clase en su propio archivo .py.

En C# por ejemplo, tendría una clase que maneja todas las interacciones de la base de datos. Luego otra clase que tenía las reglas comerciales.

¿Es este el caso en Python?

Respuesta

25

No. El estilo típico de Python es colocar clases relacionadas en el mismo módulo. Puede ser que una clase termine en un módulo propio (especialmente si es una clase grande), pero no debería ser un objetivo en sí mismo. Y cuando lo hagas, no digas el módulo después de la clase; terminarás confundiéndote a ti mismo y a los demás sobre cuál es cuál.

+4

Viniendo de Java tuve la misma pregunta, chico, estaba confundido por un tiempo. :-) – snarkyname77

+0

Curiosamente, PyDev te ofrece la opción de hacer precisamente eso. – Uri

+0

Si importa una clase desde un archivo con múltiples clases, ¿no podría el intérprete ejecutar todas las clases en ese archivo? –

8

Cada archivo .py representa un módulo, por lo que debe mantener grupos lógicos de funciones, constantes y clases juntas en el mismo archivo.

Cada clase en un archivo .py se acaba de crear la hinchazón épica en su tabla de módulos, ya que si sólo estás interesado en una clase en la que todavía

from whatever import SomeClass 
+7

El estilo de Python usualmente usa 'minúscula' para los nombres de los módulos y 'CapWords' para los nombres de las clases: http://www.python.org/dev/peps/pep-0008/ –

+0

Tienes toda la razón, Greg, voy a editar. – richo

+0

A veces los estilos son tontos. Si tienes una clase Foo, ve y ponla en el módulo Foo.py. ¿Por qué lo pondría en minúsculas foo.py? Entonces puedes escribir 'from foo import Foo'? Al escribir '__all__ = ['Foo']' en el módulo, puede escribir 'from foo import *' o 'from Foo import *' y no habrá confusión. Así que los nombres de módulos en minúscula son tontos si solo contienen una clase. –

1

Probablemente no se puede. Los archivos Python son "módulos". Los módulos deben contener exactamente qué código es reutilizable de forma independiente. Si eso comprende varias clases, que es la norma, entonces eso está perfectamente bien.

3

Otro punto que vale la pena mencionar es que si un archivo crece demasiado, siempre puede transformarlo en un paquete, lo que facilita la reorganización sin romper el código del cliente.

+0

Un paquete es simplemente archivos múltiples (módulos múltiples). Entonces, su respuesta básicamente es que sí, que cada clase debe ir en su propio archivo (módulo) cuando la cantidad de código sea demasiado grande. –

2

No estoy de acuerdo con los demás y digo que sí. Para mí, he tenido más éxito colocando cada clase en su propio archivo (módulo). Pero hay excepciones, así que permítanme explicarlo con un ejemplo.

Si usted tiene una clase Foo, luego ponerlo en un archivo llamado Foo.py, con las siguientes secciones:

  1. importaciones
    • Aquí es donde usted tira en las dependencias.
    • Ejemplos: import math, from Bar import *
  2. Globals
    • Esto es donde se define la interfaz externa a su módulo, que son todos los símbolos que son visibles fuera de este módulo.
    • Ejemplo: __all__ = ['Foo']
    • Aquí es también donde puede definir variables globales (malas) y constantes globales (buenas). Estos globales no necesitan ser exportados; pueden hacerse globales simplemente para simplificar el código.
    • Ejemplo: PI = 3.14159 significa que puede escribir PI, mientras que si lo definió dentro de la clase Foo, entonces necesitaría escribir Foo.PI.
  3. Funciones
    • Esto es donde se define todas las funciones de nivel superior que son relevantes para la clase Foo, pero no forman parte de la clase Foo espacio de nombres. Estos son probablemente raros ya que las clases permiten tanto @staticmethods como clases internas.
    • Ejemplo: def print_foo(foo): print(foo)
  4. Clases
    • Ejemplo: class Foo(object): pass

veces que se desee colocar más de una clase en el mismo módulo. Debería hacer esto siempre que dos o más clases estén conceptualmente relacionadas con el punto donde casi siempre las usaría juntas y nunca de forma independiente. Esta es la excepción, no la norma. En este caso, agregue todos los nombres de clase al __all__ global.

Finalmente, para cada módulo Foo.py, debe haber un módulo de prueba de unidad correspondiente llamado testFoo.py.

1

Sí, cada clase en su propio archivo. Importar incluso una sola clase (o función) en un archivo con múltiples clases hace que python ejecute la definición de todas las clases en el archivo. Prueba esto:

manyClass.py

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

class tryme(): 
    print 'try me' 

Ahora escribe esto en la cáscara intérprete ...

de manyClasses importar tryme

un montón de tiempo de trabajo
pruébame

Cuestiones relacionadas