2011-08-04 19 views
6

Esto probablemente se haya preguntado antes, pero no he podido encontrar la respuesta a mi pregunta específica (bastante general ...)¿Cómo organizar correctamente una definición de clase Python con respecto a los archivos auxiliares para esa clase?

Aquí hay un ejemplo de mi pregunta. Digamos que mi paquete se llama 'escuela', y tengo una clase llamada 'libro' que tendrá archivos .py al lado que contiene la carne de sus métodos. No estoy seguro de cómo organizarlo todo para que las declaraciones de importación no parezcan extrañas.

¿Cómo organizo los archivos?

/school/ 
     pencil/ 
     book/ 
      __init__.py 
      read.py 
      burn.py 
      book.py 

Quiero ser capaz de hacer algo como esto, ya que tiene más sentido:

from school import Book 
b = Book(name="The Bible") 
b.read() 

Pero a partir de la estructura de archivos más arriba, tendría que hacer:

from school.book import Book 
b = Book(....etc 

O

from school import book 
b = book.Book(...etc 

T Estos son torpes/repetitivos ... ¿Qué me estoy perdiendo aquí?

Respuesta

7

Estás confundiendo paquetes con clases, creo. Personalmente, pondría cada definición de clase y todas las funciones que estaban directamente relacionadas con esa clase en el mismo archivo .py. Por ejemplo, leer no es un objeto, así que lo pondría como una función en la clase Libro, no en su propio archivo .py. Entonces, la estructura se vería algo como esto.

/school/ 
    pencil.py 
    book.py 

Dentro book.py, tendría algo como esto

class Book(): 
    def __init__(self,name,author,isbn,your_variable_here): 
     #Your init method 

    def read(self,kid): 
     return "{0} is reading {1}.".format(kid,self.name) 

    def burn(self,library,lighter): 
     library.remove(self) 
     lighter.light(self) 
     return "Preparing to burn people." 

Entonces, sus importaciones tener este aspecto.

from school import book 
    b = book.Book("The Art of War","Sun Tzu",'999342052X','Books rock!') 
    b.read(ike) #This assumes ike is an object, probably of the class Student, defined and imported from elsewhere 
    b.burn(library,lighter) #Once more, I'm assuming these are objects for which you've imported the definition and defined them earlier. 

Esta ventaja de este sistema es que se acerca más a la realidad de los modelos. En lugar de un conjunto de funciones agrupadas por una estructura de archivos (que, como ha notado, pueden complicarse), las agrupa por clases en grupos lógicos y construcciones. Sin embargo, argumentaría que el Estudiante debería tener la función de lectura y que la biblioteca debería tener la función de finalización de la tarea, dejando libros con solo la función de grabación. Pero eso se debe a que los libros no leen, la gente sí. Y los libros no se prestan, las bibliotecas sí. Esa es una cuestión de cómo quieres organizarlo.

+0

Gracias por la respuesta. Pero, ¿y si mis métodos de lectura() y burn() son cientos de líneas cada uno y no quiero que book.py sea una enorme confusión de código? – Ian

+1

¿Cada método tiene cientos de líneas? Honestamente, trataría de encontrar formas de refactorizar así que es una cantidad de funciones más cortas. Eso no siempre es posible, obviamente, pero aún así lo intentaré. Idealmente, desearía que cada función hiciera una cosa, y una sola cosa, y quisiera que encajara en una sola 'página' (ya sea una página impresa o una sola pantalla de su editor sin desplazarse). Dicho esto, incluso si tuviera algunas funciones que tuvieran varios cientos de líneas, igual las pondría todas en la misma clase. Se adapta mejor al modelo de objetos de Python y es más fácil encontrarlo todo. – Jonathanb

+1

Luego, probablemente se puedan dividir en partes más pequeñas, dejándote con un montón de pequeños métodos privados y pequeños métodos de entrada pública read() y burn() que organizan el trabajo de los métodos más pequeños. Pero en cualquier caso, personalmente no veo que un método complejo sea más fácil de entender en un archivo separado (lejos de todo lo demás que se refiere en la clase) que en el archivo principal. – Ben

Cuestiones relacionadas