python - son - ¿Por qué usar el método de clase en lugar del método estático?
metodos estaticos java (3)
Esta pregunta ya tiene una respuesta aquí:
Sé lo que hacen y he visto muchos ejemplos de ambos, pero no he encontrado un solo ejemplo en el que tendría que usar el classmethod
de classmethod
lugar de reemplazarlo con un staticmethod
.
El ejemplo más común de classmethod
de classmethod
que he visto es para crear una nueva instancia de la clase en sí, como esta (ejemplo muy simplificado, no se usa el método atm. Pero se entiende la idea):
class Foo:
@classmethod
def create_new(cls):
return cls()
Esto devolvería una nueva instancia de Foo
al llamar a foo = Foo.create_new()
. Ahora por qué no puedo usar esto en su lugar:
class Foo:
@staticmethod
def create_new():
return Foo()
Hace exactamente lo mismo, ¿por qué debería usar un classmethod
sobre un staticmethod
?
De los docs , un método de clase recibe su clase como un argumento implícito, mientras que los métodos estáticos no son conscientes de la clase en la que residen.
Esto puede ser útil en situaciones en las que tiene un método estático heredado que desea anular con un comportamiento diferente en la subclase.
Hay poca diferencia en su ejemplo, pero suponga que creó una subclase de Foo
y llamó al método create_new
en la subclase ...
class Bar(Foo):
pass
obj = Bar.create_new()
... entonces esta clase base causaría la creación de un nuevo objeto Bar
...
class Foo:
@classmethod
def create_new(cls):
return cls()
... mientras que esta clase base causaría la creación de un nuevo objeto Foo
...
class Foo:
@staticmethod
def create_new():
return Foo()
... así que la elección dependerá del comportamiento que quieras.
Sí, esas dos clases harían lo mismo.
Sin embargo, ahora imagine un subtipo de esa clase:
class Bar (Foo):
pass
Ahora llamando a Bar.create_new
hace algo diferente. Para el método estático, obtienes un Foo
. Para el método de clase, obtienes una Bar
.
Entonces, la diferencia importante es que un método de clase obtiene el tipo pasado como parámetro.