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

Что такое хороший способ упорядочить методы в классе Python?

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

Когда я извлекаю методы в Eclipse с PyDev, Eclipse помещает извлеченный метод поверх модифицированного метода. Но это приводит к деталям более низкого уровня перед деталями более высокого уровня. По словам дяди Боба, я должен сделать наоборот, чтобы мой код читался как заголовки газеты. Когда я программирую Java, я просто следую его совету.

Какова наилучшая практика для Python?

4b9b3361

Ответ 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"

Очевидно, это менее полезно для небольших классов.