@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.

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

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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.