Подтвердить что ты не робот

Статические классы в Python

Я когда-то читал (думаю, на странице от Microsoft), что это хороший способ использовать статические классы, когда вам НЕ НУЖНО два или более экземпляра класса.

Я пишу программу на Python. Это плохой стиль, если я использую @classmethod для каждого метода класса?

4b9b3361

Ответ 1

По моему опыту создание класса - очень хорошее решение по ряду причин. Один из них заключается в том, что вы завершаете использование класса как "нормального" класса (например, более одного экземпляра) чаще, чем вы думаете. Это также разумный выбор стиля, чтобы придерживаться классов для everthing; это может облегчить для других, кто читает/поддерживает ваш код, esp, если они очень OO - им будет удобно работать с классами. Как отмечается в других ответах, разумно просто использовать "голые" функции для реализации. Возможно, вы захотите начать с класса и сделать его одноэлементным /Borg шаблоном (много примеров, если вы googlefor них); это дает вам гибкость (повторное) использование класса для удовлетворения других потребностей. Я бы рекомендовал против подхода "статический класс" как нестандартный и непитонический, что затрудняет чтение и поддержку.

Ответ 2

Как правило, использование, как это, лучше делать, просто используя функции в модуле, без класса вообще.

Ответ 3

Это ужасный стиль, если вам действительно не нужен доступ к классу.

Статический метод [...] не переводит на класс класса Python. О, конечно, это приводит к более или менее такому же эффекту, но цель classmethod состоит в том, чтобы делать что-то, что обычно не возможно [...] (например, наследование нестандартного конструктора). Идиоматический перевод статического метода [...] - это, как правило, функция уровня модуля, а не метод класса или staticmethod.

источник

Ответ 4

Есть несколько подходов, которые вы могли бы предпринять для этого. Как уже упоминалось, вы можете просто использовать функции уровня модуля. В этом случае сам модуль является пространством имен, которое их объединяет. Еще один вариант, который может быть полезен, если вам нужно отслеживать состояние, - это определить класс с обычными методами (с самообучением), а затем определить его один глобальный экземпляр и скопировать его методы экземпляра в пространство имен модулей. Это подход, используемый стандартным библиотечным "случайным" модулем - взгляните на lib/python2.5/random.py в вашем каталоге python. Внизу это имеет что-то вроде этого:

# Create one instance, seeded from current time, and export its methods
# as module-level functions.  [...]
_inst = Random()
seed = _inst.seed
random = _inst.random
uniform = _inst.uniform
...

Или вы можете взять базовый подход, который вы описали (хотя я бы рекомендовал использовать @staticmethod, а не @classmethod в большинстве случаев).

Ответ 6

Я действительно беспокоюсь о том, насколько программная инженерия понимают некоторые респонденты. Если вы не помещаете структуру данных в класс и не используете средства доступа, как избежать проблем, связанных с общей связью?