resueltos - ¿Hay alguna ventaja en usar una clase de Python?
poo python 3 (7)
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?
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. Así que mi respuesta es tal vez , 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.
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.
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 nada más 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.
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 quiera usar un método de clase de todos modos).
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 para ellos en java o c #, se usan en casos muy especiales.
No. Sería mejor hacerles funciones y si están relacionadas, colocarlas en su propio módulo. Por ejemplo, si tienes 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 esta 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 entre sí 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()
Al usar esta solución, puede probar una función de forma aislada, ya que puede anular el comportamiento de otra función o inyectar dependencias mediante el constructor.