Quando tenho métodos regulares para chamar outro método em uma classe, tenho que fazer isso
class test:
def __init__(self):
pass
def dosomething(self):
print "do something"
self.dosomethingelse()
def dosomethingelse(self):
print "do something else"
mas quando tenho métodos estáticos, não consigo escrever
self.dosomethingelse()
porque não há instância. Como devo fazer em Python para chamar um método estático de outro método estático da mesma classe?
Edit: que bagunça. Ok, editei de volta a pergunta para a pergunta original. Já tenho a resposta para a segunda pergunta que está no comentário de Peter Hansen. Se você acha que eu deveria abrir outra pergunta para uma resposta que já tenho, por favor me diga.
python
static-methods
Pablo
fonte
fonte
Respostas:
class.method
Deveria trabalhar.fonte
fonte
Test.static_method_to_call()
deve funcionar a partir de outros métodos não estáticos e não de classe desta classe também, certo? (... e provavelmente outras aulas também?)Test.static_method_to_call()
funcionará em qualquer lugar.NOTA - parece que a pergunta mudou um pouco. A resposta à questão de como você chama um método de instância a partir de um método estático é que você não pode sem passar uma instância como um argumento ou instanciar essa instância dentro do método estático.
O que se segue é principalmente para responder "como você chama um método estático de outro método estático":
Tenha em mente que não é uma diferença entre métodos estáticos e métodos de classe em Python. Um método estático não leva nenhum primeiro argumento implícito, enquanto um método de classe leva a classe como o primeiro argumento implícito (geralmente
cls
por convenção). Com isso em mente, veja como você faria isso:Se for um método estático:
Se for um método de classe:
fonte
cls.dosomethingelse()
de dentro da definição de classe.cls.dosomethingelse()
o método de classe em si. Assim como você só pode usarself
de dentro de um método de instância.OK, a principal diferença entre métodos de classe e métodos estáticos é:
fonte
você não pode chamar métodos não estáticos a partir de métodos estáticos, mas criando uma instância dentro do método estático .... deve funcionar assim
espero que ajude você :)
fonte
@classmethod
para declarar seus métodos, e usarcls.dosomethingelse()
dentrocls.dosomething()
- pior em termos de desempenho (instanciar objetos apenas para obter acesso a um método estático) e legibilidade (não é simples, e imagino que esse tipo de de padrão tornou-se clichê, a base de código inteira pode se tornar bastante difícil para um mero humano analisar)Se eles não dependem da classe ou instância, por que não torná-los apenas uma função? Pois esta parece ser a solução óbvia. A menos, é claro, que você ache que será necessário sobrescrever, criar uma subclasse etc. Nesse caso, as respostas anteriores são a melhor aposta. Dedos cruzados Eu não vou ficar marcado apenas por oferecer uma solução alternativa que pode ou não atender às necessidades de alguém;).
Como a resposta correta dependerá do caso de uso do código em questão;) Aproveite
fonte