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

Является ли хорошей идеей использовать класс в качестве пространства имен в Python

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

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)

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

Это хорошая идея? Любая ловушка с таким подходом?

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

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

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

4b9b3361

Ответ 1

Нет. Прикрепите его в модуле.

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Если у вас большой класс, возможно, вам понадобится модуль

Ответ 4

Это зависит от ситуации; если вы можете придерживаться константы в модуле и иметь смысл, непременно это сделаете, но помещение их в класс может сделать их смысл более очевидным и позволить подобным константам иметь больше "абстракции": размещение их в ServerError имеет больше смысла, чем все, что было добавлено с SERVER_ERROR, свободно находящимся в модуле.

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