Pergunta

Eu tenho uma classe Python cheia de métodos estáticos. Quais são as vantagens e desvantagens de embalagem-los em uma classe em vez de funções de matérias-?

Foi útil?

Solução

Não há nenhum. Isto é o que os módulos são para: agrupar funções relacionadas. Usando uma classe cheia de métodos estáticos me faz encolher de Javaitis. A única vez que eu iria usar uma função estática é se a função é uma parte integrante da classe. (Na verdade, eu provavelmente vai querer usar um método de classe de qualquer maneira.)

Outras dicas

No. Seria melhor para torná-los funções e se eles estão relacionados, colocá-los em seu próprio módulo. Por exemplo, se você tem uma classe como este:

class Something(object):

    @staticmethod
    def foo(x):
        return x + 5

    @staticmethod
    def bar(x, y):
        return y + 5 * x

Então seria melhor ter um módulo como,

# something.py

def foo(x):
    return x + 5

def bar(x, y):
    return y + 5 * x

Dessa forma, você usá-los da seguinte forma:

import something
print something.foo(10)
print something.bar(12, 14)

Do not ter medo de namespaces. ;-)

Se suas funções são dependentes uns dos outros ou global estado, considerar também a terceira abordagem:

class Something(object):
    def foo(self, x):
        return x + 5

    def bar(self, x, y):
        return y + 5 * self.foo(x)

something = Something()

Usando essa solução você pode testar uma função em isolamento, porque você pode substituir o comportamento de outra função ou injetar dependências usando construtor.

As aulas só são úteis quando você tem um conjunto de funcionalidades do que interage com um conjunto de dados (propriedades de instância) que precisa ser mantido entre chamadas de função e referenciado de uma forma discreta.

Se a sua classe contém nada além de métodos estáticos, em seguida, sua classe é apenas cruft sintática e funções retas são muito mais claras e tudo o que você precisa.

Eu concordo com Benjamin. Ao invés de ter um monte de métodos estáticos, você provavelmente deve ter um monte de funções. E se você quer organizá-los, você deve pensar sobre o uso de módulos em vez de classes. No entanto, se você quiser refatorar seu código para ser OO, isso é outra questão.

Não apenas não existem vantagens, mas isso torna as coisas mais lento do que usar um módulo completo de métodos. Há muita necessidade menos para métodos estáticos em python do que há para eles em Java ou C #, eles são usados ??em casos muito especiais.

Depende da natureza das funções. Se eles não são fortemente independentes (quantidade mínima de chamadas entre eles) e eles não têm qualquer estado, então sim, eu diria que despejá-los em um módulo. No entanto, você poderia estar dando um tiro no próprio pé, se você precisar modificar o comportamento que você está jogando herança pela janela. Assim, a minha resposta é talvez , e certifique-se de olhar para o seu cenário específico em vez de sempre assumindo um módulo é a melhor maneira de coletar um conjunto de métodos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top