¿Realmente necesitamos @staticmethod decorator en python para declarar el método estático?

Tengo curiosidad acerca de por qué necesitamos que el decorador @staticmethod declare el método como static . Estaba leyendo acerca de los métodos estáticos en Python, y llegué a saber que el método estático se puede llamar sin instanciar su clase. Así que probé los dos ejemplos a continuación, pero ambos hacen lo mismo:

 class StatMethod: def stat(): print("without Decorator") class StatMethod_with_decorator: @staticmethod def stat(): print("With Decorator") 

Si llamo directamente al método stat() en la clase, ambos imprimen / muestran los valores a continuación:

 >> StatMethod.stat() without Decorator >> StatMethod_with_decorator.stat() With Decorator 

Necesitas el decorador si intentas llamar a @staticmethod desde la instancia de la clase en lugar de a la clase directamente

 class Foo(): def bar(x): return x + 5 >>> f = Foo() >>> f.bar(4) Traceback (most recent call last): File "", line 1, in  f.bar(4) TypeError: bar() takes 1 positional argument but 2 were given 

Ahora, si declaro @staticmethod el argumento self no se pasa implícitamente como el primer argumento

 class Foo(): @staticmethod def bar(x): return x + 5 >>> f = Foo() >>> f.bar(4) 9 

La documentación describe algunas transformaciones que se realizan al llamar a un método definido por el usuario:

Tenga en cuenta que la transformación de objeto de función a objeto de método (no vinculado o enlazado) ocurre cada vez que el atributo se recupera de la clase o instancia. En algunos casos, una optimización fructífera es asignar el atributo a una variable local y llamar a esa variable local. También tenga en cuenta que esta transformación solo ocurre para funciones definidas por el usuario; otros objetos recuperables (y todos los objetos no recuperables) se recuperan sin transformación. También es importante tener en cuenta que las funciones definidas por el usuario que son atributos de una instancia de clase no se convierten a métodos enlazados; esto solo sucede cuando la función es un atributo de la clase.

Para los métodos marcados como método estático esto es diferente:

Los objetos de método estático proporcionan una forma de anular la transformación de objetos de función a objetos de método descritos anteriormente. Un objeto de método estático es un envoltorio alrededor de cualquier otro objeto, generalmente un objeto de método definido por el usuario. Cuando un objeto de método estático se recupera de una clase o una instancia de clase, el objeto realmente devuelto es el objeto envuelto, que no está sujeto a ninguna transformación adicional. Los objetos de método estático no son callables en sí mismos, aunque los objetos que envuelven normalmente lo son. Los objetos de método estático son creados por el constructor staticmethod () incorporado.

Si la función tiene algunos parámetros, entonces el método no estático de llamada fallaría

y el método estático no usó las variables locales en la clase, pero el método de la clase será