2009-01-18 31 views
16

Tengo una clase de Python llena de métodos estáticos. ¿Cuáles son las ventajas y desventajas de empaquetar estos en una clase en lugar de funciones sin procesar?¿Hay alguna ventaja en el uso de una clase de Python?

+0

Estoy de acuerdo con el consenso aquí, así que me he preguntado: ¿por qué Python es compatible con los métodos estáticos en absoluto? –

+0

@Darius principalmente para la coherencia de OO –

Respuesta

29

No hay ninguno. Para esto sirven los módulos: agrupar funciones relacionadas. Usar una clase llena de métodos estáticos me hace encogerme de Javaitis. La única vez que usaría una función estática es si la función es una parte integral de la clase. (De hecho, probablemente querría usar un método de clase de todos modos.)

0

Estoy de acuerdo con Benjamin. En lugar de tener un montón de métodos estáticos, probablemente deberías tener un montón de funciones. Y si desea organizarlos, debe pensar en usar módulos en lugar de clases. Sin embargo, si quiere refactorizar su código para que sea OO, ese es otro asunto.

0

No solo no hay ventajas, sino que hace las cosas más lentas que con un módulo lleno de métodos. Hay mucha menos necesidad de métodos estáticos en python que para ellos en java o C#, se usan en casos muy especiales.

12

No. Sería mejor hacerles funciones y si están relacionadas, colóquelas en su propio módulo. Por ejemplo, si usted tiene una clase como esta:

class Something(object): 

    @staticmethod 
    def foo(x): 
     return x + 5 

    @staticmethod 
    def bar(x, y): 
     return y + 5 * x 

Entonces sería mejor tener un módulo similar,

# something.py 

def foo(x): 
    return x + 5 

def bar(x, y): 
    return y + 5 * x 

De esta manera, los utiliza de la siguiente manera:

import something 
print something.foo(10) 
print something.bar(12, 14) 

No tengas miedo de los espacios de nombres. ;-)

1

Las clases solo son útiles cuando tiene un conjunto de funcionalidades que interactúa con un conjunto de datos (propiedades de instancia) que debe persistir entre las llamadas a funciones y se hace referencia de forma discreta.

Si su clase no contiene otra cosa que métodos estáticos, entonces su clase es solo cruft sintáctico, y las funciones directas son mucho más claras y todo lo que necesita.

5

Si sus funciones son dependientes el uno del otro estado o global, tenga en cuenta también el tercer enfoque:

class Something(object): 
    def foo(self, x): 
     return x + 5 

    def bar(self, x, y): 
     return y + 5 * self.foo(x) 

something = Something() 

Utilizando esta solución se puede probar una función de forma aislada, porque se puede anular el comportamiento de otra función o inyectar dependencias usando constructor.

0

Depende de la naturaleza de las funciones. Si no están fuertemente relacionados (una cantidad mínima de llamadas entre ellos) y no tienen ningún estado, entonces sí, diría que los coloque en un módulo. Sin embargo, podría dispararse en el pie si alguna vez necesita modificar el comportamiento ya que está arrojando herencia por la ventana. Entonces mi respuesta es , quizás, y asegúrese de mirar su escenario particular en lugar de asumir siempre que un módulo es la mejor manera de recopilar un conjunto de métodos.

Cuestiones relacionadas