@staticmethod vs función a nivel de módulo

13

¡Esto no es sobre @staticmethod y @classmethod ! Sé cómo funciona staticmethod . Lo que quiero saber es los casos de uso adecuados para @staticmethod frente a una función de nivel de módulo.

He buscado en Google esta pregunta, y parece que hay un cierto acuerdo general de que las funciones de nivel de módulo son preferibles a los métodos estáticos porque es más pitón. Los métodos estáticos tienen la ventaja de estar ligados a su clase, lo que puede tener sentido si solo esa clase lo usa. Sin embargo, en Python, la funcionalidad generalmente se organiza por módulo y no por clase, por lo que hacer que una función de módulo tenga sentido también.

Los métodos estáticos también pueden ser reemplazados por subclases, lo cual es una ventaja o desventaja dependiendo de cómo se mire. Aunque, los métodos estáticos suelen ser "funcionalmente puros", por lo que puede que no sean inteligentes, pero puede ser conveniente a veces (aunque este puede ser uno de esos "convenientes, pero NUNCA LO HAGAS" las cosas que solo la experiencia pueden enseñarte).

¿Hay alguna regla general para usar las funciones de método estático o de módulo? ¿Qué ventajas o desventajas concretas tienen (por ejemplo, extensión futura, extensión externa, legibilidad)? Si es posible, también proporcione un ejemplo de caso.

    
pregunta darkfeline 25.10.2012 - 06:02

3 respuestas

7

Técnicamente, un método estático y una función de módulo se comportan de manera bastante idéntica: en ambos casos funcionan como funciones estándar, la diferencia es el espacio de nombres donde se colocan. Así que la decisión es más de mantenimiento / legibilidad.

En general, usaría un método estático si se cumplen algunos o todos estos criterios:

  • Ya existe una clase con métodos normales
  • La función se relaciona con los objetos de la clase en general, pero no con una instancia específica
  • Desea poder llamar al método como si fuera un método no estático, posiblemente porque es posible que desee que el método no sea estático en el futuro sin romper el código del cliente
respondido por el Michael Slade 15.11.2012 - 13:33
0

Un programa es una simulación de una pieza de realidad. De esta manera, depende de cómo percibas la realidad.

Una función representa alguna actividad. Cuanto más general es la actividad, mayor es la tendencia a simular la actividad con una función. Los métodos están ligados a las clases. Cuanto más específica es la actividad de la clase, más tiende a ser simulada por un método.

Piensa en las funciones trigonométricas. Digamos que el sin() es tan conocido que sabes que encaja con los ángulos. Sabes que quiere un número flotante como entrada y devuelve el valor flotante. De todos modos, puede haber un tipo de datos de ángulo representado por una clase y el .sin() sin argumento podría ser un método normal que funciona con el objeto de ángulo, y .sin(x) con un solo argumento podría ser un método estático de la clase. Podría apostar a que más personas piensan que es mejor hacer que sin() sea una función simple. Están más acostumbrados a.

Otro punto de vista : un módulo se parece a una instancia de clase. Tiene sus propias variables miembro y funciones miembro. En cierto sentido, implementa un patrón singleton. Cada vez que lo importas desde otro módulo de la aplicación, obtienes acceso a exactamente las mismas variables y funciones.

    
respondido por el pepr 25.10.2012 - 15:58
0

Tengo una función que tomará parte de la jerarquía de datos profundos de un objeto como argumento. Sería engorroso pasar los diversos argumentos necesarios para llegar a esa parte de la jerarquía de datos. Así que no tienen ninguna razón para hacer referencia a sí mismo o cls. Pero la funcionalidad solo se utilizará en partes de objetos de una clase en particular. Así que me parece un método de clase.

Además, prefiero importar el nombre de la clase ('desde la clase de importación del módulo' en lugar de 'importar el módulo'). Incluir la función como un método estático me da acceso al método mientras escribirlo como una función de nivel de módulo requeriría una importación diferente.

    
respondido por el Dvd Avins 29.04.2016 - 03:11

Lea otras preguntas en las etiquetas