2009-12-07 57 views
56

Cuando tengo métodos regulares para llamar otro método en una clase, tengo que hacer estométodos estáticos Python - cómo llamar a un método de otro método

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 que no pueden escriba

self.dosomethingelse() 

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

Editar: qué desastre. Ok, edité 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 cuéntame.

+2

@pablo: no se puede cambiar la esencia de la cuestión !! ¡Termina esta pregunta y comienza ** otra **! – jldupont

+0

ok, ok. ¿quieres decir eliminar la pregunta? La respuesta ya está allí en el comentario de Peter Hansen – Pablo

+0

@pablo: no se puede eliminar aquí que no sería educado para todos los que respondieron a su pregunta. Necesita aceptar una respuesta ** y ** crear una nueva pregunta. – jldupont

Respuesta

47

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() 
+11

Se deben agregar consejos aquí: Está claro que los métodos de clase no tienen inconvenientes con respecto a los métodos estáticos, y los métodos de clase permiten que el método se extienda en el futuro para llamar a otros métodos de clase. Por lo tanto, siempre se debe preferir, aunque no haya una necesidad inmediata. – u0b34a0f6ae

+0

** NOTA ** @pablo ** cambió ** la pregunta !!!!! – jldupont

+1

@ u0b34a0f6ae: No sé si estoy haciendo algo bueno o no ... pero definí un decorador dentro de una clase. El decorador tenía que ser un "método estático", no un "método de clase". –

8

NOTA - parece que la cuestión ha cambiado un poco. La respuesta a la pregunta de cómo se llama a un método de instancia de un método estático es que no se puede sin pasar a una instancia como un argumento o una instancia de esa instancia en el interior del método estático.

Lo que sigue es sobre todo para responder a "¿cómo se llama a un método estático de 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 tiene en primer argumento implícito, mientras que un método de la clase toma la clase como primer argumento implícito (por lo general cls por convención). Con esto en mente, he aquí cómo usted haría lo siguiente:

Si se trata de un método estático:

test.dosomethingelse() 

Si se trata de un método de clase:

cls.dosomethingelse() 
+1

solo puedes usar 'cls.dosomethingelse()' desde la definición de la clase. – jldupont

+1

Para ser más precisos, solo puede usar 'cls.dosomethingelse()' desde el propio método de clase. Al igual que solo puedes usar 'self' desde dentro de un método de instancia en sí mismo. –

+1

lo siento, escribí la pregunta erróneamente. OOPS !. Quería escribir "¿Qué debo hacer en Python para llamar a un método de instancia desde otro método estático de la misma clase" y no "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" clase " – Pablo

2

usted no puede llamar a los métodos no estáticos de los métodos estáticos sino mediante la creación de una instancia dentro del método estático .... debe trabajar así esperanza

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() 

que le ayudará a :)

+1

IMO este enfoque es notablemente peor que simplemente usar '@ classmethod' para declarar tus métodos, y usar' cls.dosomethingelse() 'dentro de' cls.dosomething() '- peor en términos de rendimiento (crear instancias de objetos solo para obtener acceso a un método estático) y legibilidad (no es sencillo, y me imagino que si ese tipo de patrón se convirtiera en repetitivo, toda la base de código podría ser bastante difícil de analizar por un simple humano) –

+0

Como leí en otro lugar en SO, en lugar de inicializar instancia directamente para llamar a un método, puede simplemente llamarlo; se iniciará solo. – Nakilon

3

ok la deffirence principal entre los métodos de clase y los métodos estáticos es: el método de clase tiene su propia identidad, por eso tienen que ser llamados desde dentro de una INSTANCIA. en el método estático otra parte puede ser compartido entre varias instancias de modo que debe ser llamado desde dentro de la clase

69

¿Cómo tengo que hacer en Python para llamar a un método estático de 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() 
0

Si éstas no dependen de la clase o instancia a continuación, ¿por qué no hacen una función? Como esto parece ser la solución obvia. A menos que, por supuesto, usted piensa que va a tener que ser sobrescritos, etc. subclase Si es así, las respuestas anteriores son la mejor apuesta. Crucemos los dedos 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;) disfrutar

Cuestiones relacionadas