Есть ли преимущество в использовании класса Python? - PullRequest
16 голосов
/ 19 января 2009

У меня есть класс Python, полный статических методов. Каковы преимущества и недостатки их упаковки в классе, а не в сырых функциях?

Ответы [ 7 ]

31 голосов
/ 19 января 2009

Там нет ни одного. Это то, для чего предназначены модули: группировка связанных функций. Использование класса, полного статических методов, заставляет меня съеживаться от Javaitis. Единственный раз, когда я бы использовал статическую функцию, это если функция является неотъемлемой частью класса. (На самом деле, я бы все равно хотел использовать метод класса.)

13 голосов
/ 19 января 2009

Нет. Было бы лучше сделать их функции и, если они связаны, поместите их в свой собственный модуль. Например, если у вас есть такой класс:

class Something(object):

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

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

Тогда было бы лучше иметь такой модуль, как

# something.py

def foo(x):
    return x + 5

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

Таким образом, вы используете их следующим образом:

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

Не бойтесь пространств имен. ;-)

5 голосов
/ 19 января 2009

Если ваши функции зависят друг от друга или от глобального состояния, рассмотрите также третий подход:

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

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

something = Something()

Используя это решение, вы можете протестировать функцию изолированно, потому что вы можете переопределить поведение другой функции или внедрить зависимости с помощью конструктора.

1 голос
/ 19 января 2009

Классы полезны только тогда, когда у вас есть набор функциональных возможностей, который взаимодействует с набором данных (свойств экземпляра), которые необходимо сохранять между вызовами функций и ссылаться на них дискретным образом.

Если ваш класс не содержит ничего, кроме статических методов, тогда ваш класс - это просто синтаксическая критика, а прямые функции намного понятнее и все, что вам нужно.

0 голосов
/ 19 января 2009

Зависит от характера функций. Если они не сильно связаны между собой (минимальное количество вызовов между ними), и у них нет состояния, тогда да, я бы сказал, сбросьте их в модуль. Однако вы можете выстрелить себе в ногу, если вам когда-нибудь понадобится изменить поведение, когда вы выбрасываете наследство в окно. Так что мой ответ возможно , и убедитесь, что вы смотрите на свой конкретный сценарий, а не всегда предполагаете, что модуль является лучшим способом сбора набора методов.

0 голосов
/ 19 января 2009

Мало того, что нет никаких преимуществ, но это делает вещи медленнее, чем использование модуля, полного методов. Статических методов в python гораздо меньше, чем в java или c #, они используются в очень особых случаях.

0 голосов
/ 19 января 2009

Я согласен с Бенджамином. Вместо того, чтобы иметь кучу статических методов, вы, вероятно, должны иметь кучу функций. И если вы хотите организовать их, вам следует подумать об использовании модулей, а не классов. Однако, если вы хотите изменить код на OO, это другой вопрос.

...