Статический метод против функции модуля в python - PullRequest
9 голосов
/ 26 августа 2010

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

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

Ответы [ 3 ]

7 голосов
/ 26 августа 2010

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

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

__all__ = ['my_class_name']

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

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

3 голосов
/ 26 августа 2010

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

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

3 голосов
/ 26 августа 2010

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

...