2012-07-26 35 views
5

Estoy haciendo esta pregunta con respecto a Python, aunque probablemente sea aplicable a la mayoría de los lenguajes OOP.Creando una clase de Python para "solo una instancia"?

Cuando solo espero utilizar el modelo de datos una sola vez en cualquier programa, podría hacer una clase con clase/métodos estáticos y atributos o simplemente hacer una clase regular y crear una instancia y solo usar esa copia. En este caso, ¿qué método es mejor y por qué?

Con python, también podría escribir un módulo y usarlo como lo haría con una clase. En este caso, ¿qué camino es mejor y por qué?

Ejemplo: Quiero tener una estructura de datos central para acceder/guardar datos en los archivos. manera

Módulo:

data.py

attributes = something 
... 
def save(): 
... 

main.py

import data 
data.x = something 
... 
data.save() 

manera Clase:

class Data: 
    attributes = something 
    @classmethod 
    def save(cls): 

Data.x = something 
Data.save() 

manera ejemplo

class Data: 
    def save(self): 

data = Data() 
data.x = something 
data.save() 
+4

¿Por qué el voto a favor? Esta es una pregunta de programación legítima. – darkfeline

+1

búsqueda stackoverflow para 'singleton python' – warvariuc

+2

La pregunta revisada es mucho mejor. No creo que un cierre (excepto un duplicado) esté actualmente garantizado. –

Respuesta

5

Un módulo está diseñado para encerrar estructuras comunes en un "espacio de nombre". Pero realmente en Python, un módulo es solo un archivo y puedes organizarlo como quieras. Algunas personas ponen mucha funcionalidad en un módulo. Algunas personas las distribuyen en paquetes o subpaquetes. Depende de la reutilización que desee. Si un módulo tiene un montón de dependencias y desea reutilizar solo una pequeña cantidad, tiene sentido dividirlas.

Una clase le permite definir tipos que se pueden heredar como subtipos. También te permiten definir un estado con cada instancia de esa clase.

Cuando su clase no tiene estado, y solo métodos estáticos/classmethods, es probable que no necesite una clase. Solo necesitas funciones.

Además, no puede crear un módulo y usarlo como una clase. Un módulo no puede tener subclases. Solo tienen un módulo básico init una vez en carga y luego un alcance de objetos.

Si lo que buscas son constantes, lo que significa que están definidas una vez por la vida útil de la aplicación, entonces simplemente crea un módulo constants.py con un montón de tipos primitivos como cadenas, dicts y listas.

+1

Puede usar un módulo como una clase (ver mi ejemplo), aunque parece un poco hackish. Estoy buscando algo con estado y métodos, pero solo necesitaré una instancia, ¿uso clase o instancia? – darkfeline

+0

Usted solo está utilizando el módulo para su alcance. Además de ser un objeto de módulo, no es como una clase. Cualquier objeto puede tener atributos. – jdi

+0

El estado y los métodos a veces sugieren un patrón de Singleton. Aunque algunos fruncen el ceño como un mal estilo. Si tiene estado y configuración y necesita una funcionalidad específica, entonces puede ser una clase normal. Sin embargo, debes evitar tener estructuras que modifiquen de forma activa las globales. Las constantes generalmente solo se leen – jdi

2

La implementación del módulo aleatorio estándar tiene un buen diseño que muestra la creación y el uso de instancias de nivel de módulo sin forzar un singleton en ningún usuario.

Por ejemplo, si llamo al random.random(), utiliza una instancia oculta de la clase Random que se inicializó en el momento de la importación. Si no estoy satisfecho con el valor por defecto, puedo

my_random = random.Random() 
my_random.seed('not needed but illustrative seed call') 
coin_toss = my_random.random() 

y luego tener un generador que no comparte estado con la instancia oculta. Si está interesado en este enfoque, lea random.py que está muy bien documentado; solo hay unas pocas líneas de código relevantes que no son tan complicadas.

Este enfoque da un giro interesante, Pythonic en singletons: crea uno en la importación de forma automática, pero no me impide crear más instancias si así lo deseo.

Cuestiones relacionadas