Это хорошая идея для использования класса в качестве пространства имен в Python - PullRequest
22 голосов
/ 26 августа 2010

Я помещаю кучу связанных вещей в класс.Основная цель состоит в том, чтобы организовать их в пространство имен.

class Direction:

  north = 0
  east = 1
  south = 2
  west = 3

  @staticmethod
  def turn_right(d):
    return turn_to_the_right

  @staticmethod
  def turn_left(d):
    return turn_to_the_left



# defined a short alias because direction will be used a lot
D = Direction

d0 = D.north
d1 = D.turn_right(d)

Не так много концепции объекта.В C ++ я буду использовать реальное ключевое слово языка namespace.В Python такого нет.Поэтому я пытаюсь использовать class для этой цели.

Это хорошая идея?Есть какие-нибудь подводные камни с таким подходом?

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

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

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

Ответы [ 4 ]

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

Нет.Вместо этого вставьте его в модуль.

В Python нет пространств имен так же, как в C ++, но модули служат несколько схожей цели (то есть группируют «похожие» классы и функции вместе и предоставляютуникальные имена, чтобы избежать столкновений).

Редактировать
Я видел комментарий, который вы оставили на свой вопрос.Чтобы ответить более явно, нет, в коде Pythonic не совсем правильно использовать класс для эмуляции пространства имен.Модули предназначены для группировки связанных классов, функций и переменных - вместо этого используйте модуль.Класс представляет «вещь», которая имеет поведение (методы) и данные (переменные экземпляра) - это не просто набор автономных функций и переменных.

11 голосов
/ 04 марта 2016

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

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

Предложения могут содержать и другие классы.

У многих людей есть свои идеи о том, что является или не является Пифоником. Но если бы их всех волновало что-то вроде согласованности, они бы настаивали на том, чтобы такие вещи, как len() dir() и help(), были методом объектов, а не глобальной функцией.

Делайте то, что работает, комментируйте / документируйте это, если это не обычное или очевидное использование.

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

Это зависит от ситуации; если вы можете вставить константу в модуль и сделать так, чтобы она имела смысл, сделайте это во что бы то ни стало, но размещение их в классе может сделать их значение более очевидным и позволить аналогичным константам иметь больше «абстракции»: помещая их в * Класс 1001 * имеет больше смысла, чем добавление им всех вместе с SERVER_ERROR, свободно находящимся в модуле.

Делайте то, что наиболее интуитивно понятно, но старайтесь избегать загрязнения пространства имен.

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

Да, все в порядке.Вы даже можете использовать property, чтобы методы выглядели как атрибуты.

Если у вас большой класс, лучше использовать модуль

...