@staticmethod vs função de nível de módulo

21

Não se trata @staticmethode @classmethod! Eu sei como staticmethodfunciona. O que eu quero saber é os casos de uso adequados para @staticmethoduma função no nível do módulo.

Pesquisei essa questão no Google e parece que há algum consenso geral de que as funções no nível do módulo são preferidas aos métodos estáticos, porque é mais pitônico. Os métodos estáticos têm a vantagem de estar vinculados à sua classe, o que pode fazer sentido se apenas essa classe a usar. No entanto, no Python, a funcionalidade geralmente é organizada por módulo e não por classe; portanto, também faz sentido que seja uma função do módulo.

Os métodos estáticos também podem ser substituídos por subclasses, o que é uma vantagem ou desvantagem, dependendo de como você olha para ele. Embora os métodos estáticos sejam geralmente "funcionalmente puros", a substituição pode não ser inteligente, mas às vezes pode ser conveniente (embora possa ser um desses tipos de coisas "convenientes, mas NUNCA FAÇA") que somente a experiência pode ensinar).

Existe alguma regra geral para o uso do método static ou do módulo? Que vantagens ou desvantagens concretas elas têm (por exemplo, extensão futura, extensão externa, legibilidade)? Se possível, forneça também um exemplo de caso.

darkfeline
fonte

Respostas:

11

Tecnicamente, um método estático e uma função de módulo se comportam de maneira bastante idêntica - nos dois casos, eles funcionam como funções padrão, a diferença é o espaço para nome em que são colocados. Portanto, a decisão é mais de manutenção / legibilidade.

Geralmente eu usaria um método estático se alguns ou todos esses critérios forem atendidos:

  • Já existe uma classe existente com métodos normais
  • A função refere-se a objetos da classe em geral, mas não a uma instância específica
  • Você deseja chamar o método como se fosse um método não estático, possivelmente porque pode tornar o método não estático no futuro sem quebrar o código do cliente
Michael Slade
fonte
0

Um programa é uma simulação de um pedaço da realidade. Dessa forma, depende de como você percebe a realidade.

Uma função representa alguma atividade. Quanto mais a atividade é geral, maior é a tendência de simular a atividade com uma função. Métodos são vinculados a classes. Quanto mais a atividade é específica da classe, mais ela tende a ser simulada por um método.

Pense nas funções trigonométricas. Digamos, o fato sin()é tão conhecido que você sabe que ele se encaixa nos ângulos. Você sabe que deseja um número flutuante como entrada e retorna o flutuador. De qualquer forma, pode haver um tipo de dados de ângulo representado por uma classe e o .sin()argumento sem pode ser um método normal que funciona com o objeto de ângulo, e .sin(x)com um único argumento pode ser um método estático da classe. Eu poderia apostar que mais pessoas pensam que é melhor fazer sin()uma função simples. Eles estão mais acostumados.

Outro ponto de vista : um módulo se assemelha a uma instância de classe. Possui suas próprias variáveis ​​de membro e funções de membro. Em certo sentido, implementa um padrão singleton. Sempre que você o importa de outro módulo do aplicativo, você obtém acesso exatamente às mesmas variáveis ​​e funções.

pepr
fonte
0

Eu tenho uma função que levará parte da hierarquia profunda de dados de um objeto como argumento. Seria complicado passar os vários argumentos necessários para chegar a essa parte da hierarquia de dados. Portanto, não há motivos para se referir a si ou a outros. Mas a funcionalidade será usada apenas em partes de objetos de uma classe específica. Então parece um método de classe para mim.

Além disso, prefiro importar o nome da classe ('da classe de importação de módulo' em vez de 'módulo de importação'). A inclusão da função como método estático me dá acesso ao método enquanto a escrevia como uma função no nível do módulo exigiria uma importação diferente.

DVD Avins
fonte
2
Se eu fosse você, evitaria responder na primeira pessoa. É confuso. Em vez disso, você deve escrever na segunda pessoa ao solicitante.
Aaron Hall
Possivelmente. Eu estava fornecendo um exemplo de caso de uso, que pode ou não corresponder ao que o solicitante tinha em mente.
Dvd Avins