Статический метод против функции модуля в python

Итак, у меня есть класс в модуле с некоторыми статическими методами. Несколько из этих статических методов просто выполняют проверки crc и прочее, и они не очень полезны вне класса (я бы просто сделал их частными статическими методами в java или C++). Мне интересно, должен ли я вместо этого сделать их глобальными функциями класса (вне класса).

Есть ли какая-то польза от этого в любом случае? Класс импортируется from module import class, поэтому я не беспокоюсь о том, что эти модули также будут загружены. Но должен ли я просто сделать их методами класса, чтобы from module import * было безопаснее или что-то в этом роде?


person Falmarri    schedule 25.08.2010    source источник


Ответы (3)


Префикс имен функций с одним подчеркиванием является соглашением, чтобы сказать, что они являются частными, и это также предотвратит их импорт с from module import *.

Другой способ — указать в модуле список __all__. - это можно сделать просто в самом модуле (файл __init__.py не нужен)

__all__ = ['my_class_name']

Это скорее подход с использованием белого списка, поэтому вы можете полностью контролировать то, что импортируется, без использования начальных символов подчеркивания.

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

person Scott Griffiths    schedule 26.08.2010
comment
Я не знал о __all__. Спасибо =] - person Falmarri; 26.08.2010

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

person Ignacio Vazquez-Abrams    schedule 25.08.2010

Если они бесполезны вне класса, какова мотивация делать их модульными методами? Сохранение их как статического метода делает пространство имен более чистым.

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

person Wai Yip Tung    schedule 25.08.2010