Pregunta

Tengo una clase de Python llena de métodos estáticos. ¿Cuáles son las ventajas y desventajas de empaquetarlos en una clase en lugar de funciones en bruto?

¿Fue útil?

Solución

No hay ninguno. Para eso están los módulos: agrupar funciones relacionadas. Usar una clase llena de métodos estáticos me da escalofríos 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 quiera usar un método de clase de todos modos).

Otros consejos

No. Sería mejor hacerlos funcionar y, si están relacionados, colocarlos en su propio módulo. Por ejemplo, si 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 como,

# something.py

def foo(x):
    return x + 5

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

De esa manera, los usa de la siguiente manera:

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

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

Si sus funciones dependen unas de otras o del estado global, considere 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()

Con esta solución, puede probar una función de forma aislada, ya que puede anular el comportamiento de otra función o inyectar dependencias utilizando el constructor.

Las clases solo son útiles cuando tiene un conjunto de funcionalidades que interactúa con un conjunto de datos (propiedades de instancia) que deben persistir entre llamadas a funciones y referenciarse de manera discreta.

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

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

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

Depende de la naturaleza de las funciones. Si no están muy relacionados (cantidad mínima de llamadas entre ellos) y no tienen ningún estado, sí, diría que los descargue en un módulo. Sin embargo, podrías dispararte en el pie si alguna vez necesitas modificar el comportamiento mientras arrojas la 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top