Вопрос по python, instance, static, class, class-method – Статические классы в Python

24

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

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

Ваш Ответ

5   ответов
6

вы можете просто использовать функции уровня модуля. В этом случае сам модуль является пространством имен, которое удерживает их вместе. Другой вариант, который может быть полезен, если вам нужно отслеживать состояние, состоит в том, чтобы определить класс с помощью обычных методов (принимая self), а затем определить один глобальный его экземпляр и скопировать его методы экземпляра в пространство имен модуля. Это подход, принятый стандартной библиотекой «random» модуль - взгляните на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 в большинстве случаев).

14

A static method [...] does not translate to a Python classmethod. Oh sure, it results in more or less the same effect, but the goal of a classmethod is actually to do something that's usually not even possible [...] (like inheriting a non-default constructor). The idiomatic translation of a [...] static method is usually a module-level function, not a classmethod or staticmethod.

источник

0
7

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

Большая часть вашего ответа, за исключением второго и последнего предложения, просто спорна (и я склонен не соглашаться) и не относится к делу. Я бы сказал, что все, что было бы в классах, помогло бы улучшить ситуацию, как вы думаете?
Я одновременно согласен и не согласен с этим ответом. Поэтому я не могу решить, нажимать ли кнопку вверх или вниз. В любом случае, я согласен с тем, что объекты упрощают чтение и поддержку кода. Я не согласен с использованием шаблона Singleton / Borgpython-3-patterns-idioms-test.readthedocs.io/en/latest/…, Это не то, что это плохая картина; однако использование статических методов с переменными класса намного проще поддерживать и читать в чрезвычайно сложном проекте кода. Да, технически это может быть неверно, но программисты младшего уровня будут вам благодарны.
30

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

+1. Абсолютно нет необходимости создавать класс в Python, если вы не инкапсулируете какие-либо данные.
@ Леонид Я бы сказал, что если ваши функции независимы, но все же хотят, чтобы параметры между ними были, просто передайте эти параметры. Если вы обнаружите, что у вас много звонков с одинаковыми коллекциями параметров, возможно, создайтеnamedtuple или что-то, чтобы обойти. Хранить вещи в классе просто для того, чтобы избежать их передачи, как правило, плохая идея - это может привести к проблемам.
@ Леонид Я определенно не сторонник полного отказа от государства - особенно в Python. Я имею в виду, что если хранить значения в классе не следует, когда срок службы значения равен продолжительности вызова функции - буквально, чтобы избежать передачи значения через дочерние функции. Опасность заключается в том, что внезапно это состояние может быть изменено извне (скажем, функция запускается в другом месте), что может привести к ошибкам и хрупкости. Это также уменьшает возможность повторного использования этих функций из-за их зависимости от этого состояния.
@Lattyware, я не люблю использовать состояние как философию, но реальные функциональные языки (такие как F #, Clojure, Haskell) все еще занимают довольно небольшую нишу. Python - это мультипарадигмальный язык, поэтому программисту часто приходится его использовать. Следующее довольно расплывчато: «Хранить вещи в классе, просто чтобы избежать их передачи, как правило, плохая идея - это может привести к проблемам». Не могли бы вы рассказать о конкретных опасностях, проблемах, недостатках? В противном случае я могу предположить, что вы придерживаетесь предубеждений относительно функций и объектов.
Иногда я начинаю с простых функций, но потом понимаю, что, поскольку мне нравится писать небольшие функции, мне иногда приходится передавать один и тот же параметр между 3 или 4 из них, и в этот момент я начинаю инкапсулировать этот параметр. Мне еще предстоит решить эту головоломку. Мысли?

Похожие вопросы