Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

@staticmethod e métodos inerentes às classes

Haja vista o @staticmethod não alterar em nada a execução do meu código, qual a função exata dele? Somente dizer para o desenvolvedor que o que vem abaixo dele é um método da classe?

É uma palavra reservada que serve unicamente para dizer para o desenvolvedor isso? Assim como o duplo underline antes de métodos ou atributos privados servem para dizer ao desenvolvedor que ali é um método privado.

1 resposta
solução!

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!