Что такое хороший способ упорядочить методы в классе Python?
Я хочу заказать методы в классе Python, но я не знаю, что является правильным порядком.
Когда я извлекаю методы в Eclipse с PyDev, Eclipse помещает извлеченный метод поверх модифицированного метода. Но это приводит к деталям более низкого уровня перед деталями более высокого уровня. По словам дяди Боба, я должен сделать наоборот, чтобы мой код читался как заголовки газеты. Когда я программирую Java, я просто следую его совету.
Какова наилучшая практика для Python?
Ответы
Ответ 1
Нет правильного порядка. Выберите систему и придерживайтесь ее. Я использую:
class SomeClass(object):
def __magic_methods__(self):
"magic methods first, usually in alphabetical order"
def _private_method(self):
"worker methods next, also in alpha order"
def a_method(self):
"then normal methods, also in alpha order"
Ответ 2
Как указывали другие, нет правильного способа заказа ваших методов. Возможно, предложение PEP было бы полезно, но в любом случае. Позвольте мне попытаться максимально объективно подойти к вашему вопросу.
-
Интерфейсы сначала: Общие методы и магические функции Python определяют интерфейс класса. В большинстве случаев вы и другие разработчики хотите использовать класс, а не изменять его. Таким образом, они будут заинтересованы в интерфейсе этого класса. Вначале в исходном коде избегается прокрутка деталей реализации, которые вам не нужны.
-
Свойства, магические функции, общедоступные методы: Трудно определить лучший порядок между этими тремя, которые являются частью интерфейса класса. Как говорит @EthanFurman, наиболее важно придерживаться одной системы для всего проекта. Как правило, люди ожидают __init__()
лучшей первой функции в классе, поэтому я следую другим магическим методам ниже.
-
Порядок чтения: В принципе, есть два способа рассказать историю: снизу вверх или сверху вниз. Прежде всего, поставив высокоуровневые функции, разработчик может получить грубое понимание класса, прочитав первые пару строк. В противном случае нужно было бы прочитать весь класс, чтобы получить представление о классе, и большинство разработчиков не имеют на это времени. Как правило, ставьте методы выше всех методов, называемых из их тела.
-
Методы класса и статические методы: Обычно это подразумевается описанным выше порядком чтения. Обычные методы могут вызывать все методы времени и, таким образом, первыми. Методы класса могут вызывать только методы класса и статические методы и следовать далее. Статические методы не могут вызывать другие методы класса и приходят последними.
Надеюсь, это поможет. Большинство из этих правил, кстати, не являются специфичными для Python. Я не знаю языка, который применяет порядок методов, но если это так, было бы очень интересно и прокомментировать.
Ответ 3
Я делаю что-то похожее на @Ethan, которое я видел в источнике Django, где основное различие - это большой "############" блок комментариев для разграничения областей. Например,
class SomeClass(object):
#################
# Magic Methods #
#################
def __magic_methods__(self):
"magic methods first"
##################
# Public Methods #
##################
def a_method(self):
"then normal methods, in order of importance"
###################
# Private Methods #
###################
def _private_method(self):
"then worker methods, grouped by importance or related function"
Очевидно, это менее полезно для небольших классов.