2010-08-16 14 views
11

Me da un poco de dolor de cabeza tratar de descubrir cómo organizar módulos y clases juntos. Viniendo de C++, estoy acostumbrado a las clases que encapsulan todos los datos y métodos necesarios para procesar esos datos. Sin embargo, en python hay módulos y, desde el código que he analizado, algunas personas tienen muchas funciones sueltas almacenadas en módulos, mientras que otras casi siempre vinculan sus funciones a clases como métodos.organizando clases y módulos en python

Por ejemplo decir que tengo una estructura de datos y me gustaría escribirla en el disco.

Una forma sería la implementación de un método de ahorrar para ese objeto por lo que sólo podría escribir

MyObject.save(filename) 

o algo por el estilo. Otro método que he visto en igual proporción es tener algo así como

from myutils import readwrite 

readwrite.save(MyObject,filename) 

Este es un pequeño ejemplo, y no estoy seguro de cómo pitón específica este problema es en absoluto, pero mi pregunta general es lo que es el mejor práctica pitonica en términos de funciones vs métodos de organización?

Respuesta

13

Parece que las funciones sueltas te molestan. Esta es la forma de pitón. Tiene sentido porque un módulo en python es realmente solo un objeto en el mismo pie que cualquier otro objeto. Tiene soporte de nivel de idioma para cargarlo desde un archivo, pero aparte de eso, es solo un objeto.

lo que si tengo un módulo foo.py:

import pprint 

def show(obj): 
    pprint(obj) 

Entonces el cuando importarlo de bar.py

import foo 

class fubar(object): 
    #code 

    def method(self, obj): 
     #more stuff 
     foo.show(obj) 

accedo esencialmente un método en el objeto foo. Los atributos de datos del módulo foo son solo los globales que se definen en foo. Un módulo es la implementación del nivel de idioma de un singleton sin la necesidad de anteponer self a cada lista de argumentos de métodos.

Intento escribir tantas funciones de nivel de módulo como sea posible. Si alguna función solo funciona con una instancia de una clase en particular, la convertiré en un método en la clase. De lo contrario, trato de hacer que funcione en las instancias de cada clase que se define en el módulo para el que tendría sentido. El raciocinio detrás del ejemplo exacto que usted dio es que si cada clase tiene un método de guardado, entonces si más tarde cambia cómo está guardando datos (desde el sistema de archivos say a la base de datos o archivo XML remoto), entonces debe cambiar cada clase. Si cada clase implementa una interfaz para generar los datos que quiere guardar, puede escribir una función para guardar instancias de cada clase y solo cambiar esa función una vez. Esto se conoce como el principio de responsabilidad única: cada clase debe tener solo una razón para cambiar.

3

Si tiene una clase antigua normal que desea guardar en el disco, simplemente lo convertiría en un método de instancia. Si fuera una biblioteca de serialización que pudiera manejar diferentes tipos de objetos, lo haría de la segunda manera.

+2

El término "método de clase" suena como un 'classmethod', que no es aplicable. Lo apropiado se llamaría un "método" o un "método de instancia". –

+0

Sí, tienes razón. Me refiero a un método de instancia. –