La diferencia entre @staticmethod y @classmethod

Si no sabes cuál es la diferencia entre los métodos @staticmetho y @classmethod, en este artículo lo aprenderás.

Recomendado: preguntas python

Tal vez un pequeño código de muestra pueda ayudar: observe la diferencia en las firmas de llamada foo, class_foo y static_foo:

class A(object):
    def foo(self, x):
        print(f"executing foo(, )")

    @classmethod
    def class_foo(cls, x):
        print(f"executing class_foo(, )")

    @staticmethod
    def static_foo(x):
        print(f"executing static_foo()")

a = A()

A continuación se muestra la forma habitual en que una instancia de objeto llama a un método. La instancia del objeto, aimplícitamente pasado como el primer argumento.

a.foo(1)
# executing foo(<__main__.A object at 0xb7dbef0c>, 1)

Con métodos de clasela clase de la instancia del objeto se envía implícitamente como el primer argumento en su lugar self.

a.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

También puedes llamar class_foo mediante el uso de la clase. De hecho, si define algo como un método de clase, probablemente se deba a que tiene la intención de llamarlo desde la clase en lugar de desde una instancia de clase. A.foo(1) sin embargo, habría creado un TypeError A.class_foo(1) Funciona bien:

A.class_foo(1)
# executing class_foo(<class '__main__.A'>, 1)

Un uso que la gente ha encontrado para los métodos de clase es crear diseñadores alternativos hereditarios.

Recomendado: Preguntas entrevista python

Con métodos estáticosninguno self (instancia de objeto) o cls (clase) se envía implícitamente como primer argumento. Se comportan como funciones normales, excepto que puedes llamarlas desde una instancia o clase:

a.static_foo(1)
# executing static_foo(1)

A.static_foo('hi')
# executing static_foo(hi)

Los métodos estáticos se utilizan para agrupar funciones que tienen una conexión lógica con una clase a la clase.

foo es solo una función, pero cuando llamas a.foo no solo obtiene la función, obtiene una versión «parcialmente aplicada» de la función con la instancia del objeto a enlazado como el primer argumento de la función. foo esperar 2 argumentos mientras a.foo espera solo 1 argumento.

Recomendado: Árboles de decisión en Python con Scikit-Learn

a está obligado a foo. Esto es lo que significa el término «enlazado» a continuación:

print(a.foo)
# <bound method A.foo of <__main__.A object at 0xb7d52f0c>>

Con a.class_foo, a no está obligado a class_foomás bien la clase A está obligado a class_foo.

print(a.class_foo)
# <bound method type.class_foo of <class '__main__.A'>>

Aquí con un método estático, aunque sea un método a.static_foo devuelve solo una buena función ‘ole sin argumentos vinculados. static_foo espera 1 argumento, y
a.static_foo También espere 1 argumento.

print(a.static_foo)
# <function static_foo at 0xb7d479cc>

Y por supuesto pasa lo mismo cuando llamas static_foo con la clase A en cambio.

print(A.static_foo)
# <function static_foo at 0xb7d479cc>

¿ Te fue útil este artículo ?
⬇️ Ayudame compartiendo para poder llegar a más personas.⬇️

3 comentarios en «La diferencia entre @staticmethod y @classmethod»

  1. ¿Realmente importa la diferencia entre @staticmethod y @classmethod en Python? ¡Opiniones! 🐍🔍

    • Claro que importa la diferencia entre @staticmethod y @classmethod en Python. Son conceptos fundamentales que marcan la estructura y funcionalidad de tu código. Ignorarlos es como conducir sin saber las reglas de tráfico. ¡Educarse en programación es clave, amigo! 🐍🔍

  2. ¡Interesante debate! ¿Cuál prefieres para tu código: @staticmethod o @classmethod? 🤔

Los comentarios están cerrados.