Métodos estáticos de Python: cómo llamar a un método desde otro método

Cuando tengo métodos regulares para llamar a otro método en una clase, tengo que hacer esto

class test: def __init__(self): pass def dosomething(self): print "do something" self.dosomethingelse() def dosomethingelse(self): print "do something else" 

pero cuando tengo métodos estáticos no puedo escribir

 self.dosomethingelse() 

Porque no hay instancia. ¿Qué debo hacer en Python para llamar a un método estático desde otro método estático de la misma clase?

Edición: qué lío. Ok, edité de nuevo la pregunta a la pregunta original. Ya tengo la respuesta a la segunda pregunta que está en el comentario de Peter Hansen. Si crees que debería abrir otra pregunta para una respuesta que ya tengo, por favor, dímelo.

class.method debería funcionar.

 class SomeClass: @classmethod def some_class_method(cls): pass @staticmethod def some_static_method(): pass SomeClass.some_class_method() SomeClass.some_static_method() 

¿Qué debo hacer en Python para llamar a un método estático desde otro método estático de la misma clase?

 class Test() : @staticmethod def static_method_to_call() pass @staticmethod def another_static_method() : Test.static_method_to_call() @classmethod def another_class_method(cls) : cls.static_method_to_call() 

NOTA: parece que la pregunta ha cambiado algo. La respuesta a la pregunta de cómo llamar a un método de instancia desde un método estático es que no puede pasar una instancia como un argumento o instanciar esa instancia dentro del método estático.

Lo que sigue es principalmente responder “cómo llamas a un método estático desde otro método estático”:

Tenga en cuenta que existe una diferencia entre los métodos estáticos y los métodos de clase en Python. Un método estático no toma ningún primer argumento implícito, mientras que un método de clase toma la clase como el primer argumento implícito (generalmente cls por convención). Con eso en mente, aquí es cómo lo harías:

Si es un método estático:

 test.dosomethingelse() 

Si es un método de clase:

 cls.dosomethingelse() 

OK, la principal diferencia entre los métodos de clase y los métodos estáticos es:

  • El método de clase tiene su propia identidad, por eso deben llamarse desde un INSTANCE.
  • por otro lado, el método estático se puede compartir entre varias instancias, de modo que debe llamarse desde LA CLASE

no puede llamar a métodos no estáticos desde métodos estáticos, pero al crear una instancia dentro del método estático … debería funcionar así

 class test2(object): def __init__(self): pass @staticmethod def dosomething(): print "do something" #creating an instance to be able to call dosomethingelse(),or you may use any existing instace a=test2() a.dosomethingelse() def dosomethingelse(self): print "do something else" test2.dosomething() 

Espero que te ayude 🙂

Si estos no dependen de la clase o la instancia, ¿por qué no hacer que sean una función? Como esta parece ser la solución obvia. A menos que, por supuesto, piense que será necesario sobrescribirlo, subclase, etc. Si es así, las respuestas anteriores son la mejor opción. Los dedos cruzados no me marcarán por ofrecer simplemente una solución alternativa que puede o no ajustarse a las necesidades de alguien;).

Como la respuesta correcta dependerá del caso de uso del código en cuestión;) Disfrute