2010-06-11 33 views
10

Estoy aprendiendo Python y he estado jugando con paquetes. Quería saber la mejor manera de definir clases en paquetes. Parece que la única forma de definir clases en un paquete es definirlas en el __init__.py de ese paquete. Procedente de Java, me gustaría definir archivos individuales para mis clases. ¿Es esta una práctica recomendada?Definir clases en los paquetes

me gustaría tener mi directorio tiene la forma siguiente:

recursor/ 
    __init__.py 
    RecursionException.py 
    RecursionResult.py 
    Recursor.py 

por lo que podría hacer referencia a mis clases como recursor.Recursor, recursor.RecursionException y recursor.RecursionResult. ¿Es esto factible o recomendado en Python?

+4

Obligatorio: [Python no es Java] (http://dirtsimple.org/2004/12/python-is-not-java.html) – voyager

+0

Consulte también http://stackoverflow.com/questions/2339371/ as-a-java-programmer-learning-python-what-should-i-look-out-for – froadie

+2

Sí, puedes, pero no, no deberías. –

Respuesta

8

Adelante y defina sus clases en módulos separados. A continuación, hacer __init__.py hacer algo como esto:

from RecursionException import RecursionException 
from RecursionResult import RecursionResult 
from Recursor import Recursor 

Eso importará cada clase en espacio de nombres raíz del paquete, así llamada codificada puede referirse a recursor.Recursor en lugar de recursor.Recursor.Recursor.

Sin embargo, siento la necesidad de repetir algunos de los otros comentarios aquí: Python no es Java. En lugar de crear un nuevo módulo para cada clase bajo el sol, sugiero agrupar clases estrechamente relacionadas en un solo módulo. Es más fácil entender tu código de esa manera, y el código de llamada no necesitará miles de millones de importaciones.

+4

Aunque 'recursor.Recursor.Recursor' tiene cierto encanto. – Ricky

2

Esto es perfectamente factible. Simplemente cree un nuevo módulo de clase para cada una de esas clases, y cree exactamente la estructura que publicó.

También puede hacer un módulo Recursion.py o algo similar, e incluir las 3 clases en ese archivo.

(también soy nuevo en Python desde Java, y aún no han puesto nada en mis archivos __init__.py ...)

+0

Si creo el diseño de directorio anterior, definiendo mi clase de Recursor en el archivo Recursor.py e intento importar "recursor.Recursor", obtengo un ImportError. ¿Qué estoy haciendo mal? –

+0

@rfkrocktk - puede que tenga que especificar recursor.Recursor.Recursor ... el primero para el paquete, el segundo para el módulo (el archivo) y el tercero para la clase real ... (A veces es mejor considerar usar módulos tipo de paquetes ... en lugar de un paquete recursor con estas 3 clases como archivos separados, puede tener un módulo recursor con estas 3 clases dentro de él) – froadie

1

En Python no está restringida a la definición de la clase 1 por archivo y pocos Haz eso. Puedes hacerlo si quieres, depende totalmente de ti. Un paquete en Python es solo un directorio con un archivo

__init__.py 

. No tiene que poner nada en ese archivo para controlar qué se importa, etc.

Cuestiones relacionadas