Bom dia Thiago! Tudo bom?
Eu não sou super manjador de python, mas entendo de conceitos, então acho que posso te ajudar nesse caso.
Conceito do static
Um método estático dentro de uma classe indica que este método pode ser invocado sem a necessidade de que você tenha uma instância desta classe.
Usos do static
Em geral, esse modificador é usado pra métodos que criam e retornam instâncias da própria classe, no padrão singleton, mas podem ter outros usos como por exemplo operadores de string, muito comuns em bibliotecas terceirizadas.
Exemplo prático
Abaixo vai um código com um método estático e um normal.
class Usuario(object):
@staticmethod
def anonimo():
return Usuario("anônimo")
def __init__(self, nome):
self.__nome = nome
def nome(self):
print "Nome de usuário: %s"%(self.__nome)
E aqui alguns exemplos de uso:
thiago = Usuario("thiago")
thiago.nome()
"""
>>> Nome de usuario: thiago
"""
anonimo = Usuario.anonimo()
anonimo.nome()
"""
>>> Nome de usuario: anonimo
"""
Usuario.nome(thiago)
"""
>>> Nome de usuario: thiago
"""
Usuario.nome()
"""
>>> Traceback (most recent call last):
File "usuario.py", line 25, in <module>
Usuario.nome()
TypeError: unbound method nome() must be called with Usuario instance as first argument (got nothing instead)
Tradução livre: ErroDeTipagem: método nome() não está atrelado a nenhum objeto, mas precisa ser chamado a partir de (ou tendo como primeiro argumento) uma instância de Usuario
"""
Repare que é possível (em python) utilizar um método não-estático usando a sintaxe de método estático (como no terceiro exemplo, Usuario.nome(thiago)
) e ele não lançar um erro (como no último exemplo, Usuario.nome()
) contanto que você passe uma instância válida de um objeto da mesma classe.
Casos de uso incomuns
No código acima, temos um método que retorna um usuário anônimo. Porém mesmo sendo estático, o método pode ser utilizado em uma instância, como no exemplo abaixo:
thiago = Usuario("thiago")
anonimo = thiago.anonimo()
anonimo.nome()
thiago.nome()
"""
>>> Nome de usuario: anonimo
>>> Nome de usuario: thiago
"""
Este caso de uso é incomum, mas estou colocando aqui pra mostrar que o acesso a métodos estáticos é possível. Apesar de neste caso não fazer sentido, em algumas ocorrências do padrão singleton isso pode ser uma ótima escolha de modelagem.
Se quiser um exemplo disso, posso fornecer!
Conclusão
Um método estático é bem diferente de um método normal pois seu acesso é mais aberto.
Além disso, o método estático não depende de você ter uma instância, podendo ser chamado diretamente a partir da classe. Isso fica claro na assinatura, na qual não é obrigatório passar a variável self
como primeiro parâmetro.
Espero ter ajudado a esclarecer a dúvida, Thiago! Caso ainda tenha mais alguma dúvida sobre o assunto, não hesite em perguntar! Sobre outros assuntos, pode abrir novos tópicos no fórum!
Um grande abraço, bom final de semana e bons estudos!