usar son qué método metodos metodo los instancia imprimir estaticos estatico definicion cuando cuales como clase python class python-3.x static-methods class-method

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.