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?
Respuesta
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.)
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.
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.
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. ;-)
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.
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.
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.
- 1. ¿Hay alguna razón para usar clases en Python si solo hay una clase en el programa?
- 2. ¿Hay alguna ventaja en tener una clase abstracta y una interfaz?
- 3. ¿Hay alguna ventaja en el uso de la cadena de recursos en lugar de una cadena const?
- 4. ¿Hay alguna ventaja de usar null primero en PHP?
- 5. ¿Hay alguna ventaja en agrupar consultas de medios css juntas?
- 6. ¿Hay alguna ventaja de usar palabra clave volátil en contraste para usar la clase Interbloqueado?
- 7. ¿Hay alguna ventaja al usar selectores muy específicos en CSS?
- 8. ¿Hay alguna ventaja que podamos eliminar sin desconectar el gráfico?
- 9. ¿Hay alguna ventaja en compilar un ensamblaje como x64?
- 10. ¿Hay alguna ventaja en _ever_ usando una sola comilla alrededor de una cadena en Ruby/Rails?
- 11. ¿Hay alguna ventaja en separar clases de iPhone y iPad en una aplicación Universal?
- 12. ¿Hay alguna ventaja de volver a hashtar contraseñas almacenadas en el momento del inicio de sesión?
- 13. ¿Hay alguna manera de crear una propiedad de clase en Python?
- 14. ¿Hay alguna manera de "extender" una clase en SASS?
- 15. ¿Hay alguna manera de anular automáticamente ToString() en una clase?
- 16. ¿Hay alguna manera de recorrer y ejecutar todas las funciones en una clase de Python?
- 17. ¿Hay alguna diferencia en el uso de Context.getText y Context.getResources.getText?
- 18. ¿Hay alguna desventaja en el uso de las funciones -Bsymbolic-?
- 19. ¿Hay una clase estándar de caché de Python de terceros?
- 20. ¿Hay alguna ventaja de usar '<< 1' en lugar de '* 2'?
- 21. ¿Hay alguna sobrecarga en el uso de métodos anónimos?
- 22. ¿Hay alguna forma de sobrecargar + = en python?
- 23. ¿Hay alguna ventaja en un If/Else anidado en lugar de Else If?
- 24. ¿Alguna ventaja de pasar el mouse sobre mouseover en JQuery?
- 25. LINQ - Expresión fluida y de consulta: ¿hay alguna ventaja de una sobre otra?
- 26. ¿Qué ventaja hay con el uso de UTF-8 sobre UTF-16?
- 27. ¿Hay alguna clase de contenedor Qt observable?
- 28. Despreciar el uso de una clase como clase principal en Python
- 29. ¿Hay alguna ventaja al construir mi aplicación .NET con el framework de 64 bit?
- 30. ¿Hay alguna ventaja al usar AND y OR sobre && y || en PHP?
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? –
@Darius principalmente para la coherencia de OO –