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. ¿Cómo tengo que hacer en Python para llamar a un método estático desde otro método estático de la misma clase?
Editar: qué lío. Ok, volví a editar la pregunta a la pregunta original. Ya tengo la respuesta a la segunda pregunta que está en el comentario de Peter Hansen. Si cree que debería abrir otra pregunta para obtener una respuesta que ya tengo, por favor dígame.
python
static-methods
Pablo
fuente
fuente
Respuestas:
class.method
Deberia trabajar.fuente
fuente
Test.static_method_to_call()
debería funcionar desde otros métodos no estáticos y sin clase de esta clase, ¿verdad? (... ¿y probablemente otras clases también?)Test.static_method_to_call()
funcionará desde cualquier lugar.NOTA: parece que la pregunta ha cambiado un poco. 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 sin pasar una instancia como argumento o instanciar esa instancia dentro del método estático.
Lo que sigue es principalmente para responder "cómo se llama a un método estático desde otro método estático":
Tenga en cuenta que no es una diferencia entre los métodos estáticos y métodos de clase en Python. Un método estático no toma un 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, así es como lo haría:Si es un método estático:
Si es un método de clase:
fuente
cls.dosomethingelse()
desde dentro de la definición de clase.cls.dosomethingelse()
desde el propio método de clase. Al igual que solo puede usarself
desde dentro de un método de instancia.OK, la principal diferencia entre los métodos de clase y los métodos estáticos es:
fuente
no puede llamar a métodos no estáticos desde métodos estáticos, pero creando una instancia dentro del método estático ... debería funcionar así
Espero que te ayude :)
fuente
@classmethod
para declarar sus métodos y usarlocls.dosomethingelse()
dentrocls.dosomething()
, peor en términos de rendimiento (instanciar objetos solo para obtener acceso a un método estático) y legibilidad (no es sencillo, y me imagino si ese tipo del patrón se convirtió en estándar, todo el código base podría volverse bastante difícil de analizar para un simple humano)Si estos no dependen de la clase o instancia, ¿por qué no convertirlos en una función? Ya que esto parecería 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. Crucemos los dedos. No me marcarán por ofrecer simplemente una solución alternativa que puede o no satisfacer las necesidades de alguien;).
Como la respuesta correcta dependerá del caso de uso del código en cuestión;) Disfruta
fuente