Python 2.7: порядок элементов в классах: поля, свойства, конструкторы, методы [дубликат]

Сделайте это так:

String selectQuery = String.format("SELECT %s FROM %s WHERE %s = ?",
    colID, allScreens, colName);

Cursor c = db.rawQuery(selectQuery, new String[]{name});
36
задан A-B-B 8 October 2016 в 09:41
поделиться

3 ответа

Нет ни одного правильного порядка. Выберите систему и придерживайтесь ее. Я использую:

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"
12
ответ дан Ethan Furman 15 August 2018 в 17:22
поделиться
  • 1
    Каковы ваши предпочтения для staticmethods, переменных класса и методов, украшенных @property? – John Mee 13 September 2012 в 05:56
  • 2
    @JohnMee: переменные класса, которые я поставил перед чем-либо еще; мой метод сгибания скрывает @staticmethod, @classmethod, @property и любые другие строки @decorator, поэтому я использую тип метода, чтобы определить, куда он идет (за исключением того, что свойства имеют тенденцию идти между _private_methods и normal_methods). – Ethan Furman 13 September 2012 в 17:22
  • 3
    Так что если порядок в основном идет от очень частного «магии», методы для частных к обычным методам, означает ли это @classmethod s next (@classmethod def a_class_method(cls)), затем @staticmethod s (@staticmethod def a_static_method())? По крайней мере, это политика, как я ее понимаю ... (без моей IDE сгибания всего, потому что мне это не нравится) – Kawu 23 July 2014 в 09:19

Я делаю что-то похожее на @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"

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

2
ответ дан Mateen Ulhaq 15 August 2018 в 17:22
поделиться
  • 1
    Но я вижу, что они волшебные, публичные или частные. Я активно не люблю такие блоки комментариев, сам; Я могу посмотреть на сложенный код, если я хочу просмотреть список из них. Наличие комментария над определенным блоком связанных с функциональностью методов - это то, что я сделал бы, но для этого типа комментариев - это то, что говорят мне имена методов. – Chris Morgan 24 April 2012 в 00:38
  • 2
    Опять же, я делаю это только для более крупных классов. Я считаю, что легко путать магические методы с полу-частными () и обработанными именами (_ ) методами. – Matt Luongo 24 April 2012 в 16:03
  • 3
    Я был mid-edit, удалив уродливые блоки ####, когда понял, что вы поместили их там специально! Я согласен с order , хотя это и есть то, что этот вопрос примерно. Я бы рекомендовал удалить #### из этого примера, поскольку он не относится к области вопроса, а ваш пример относится к небольшому классу, для которого вы не будете использовать #### в любом случае. :-) – Mateen Ulhaq 8 April 2018 в 07:04
  • 4
    Я удалил #### для вас; при необходимости вернитесь. – Mateen Ulhaq 8 April 2018 в 07:06
  • 5
    @ M.I.Wright Я думал, что это выходит за рамки вопроса. Как вы можете видеть, rev2 по-прежнему содержит материал, который отвечает на вопрос иначе, чем этан, с другим порядком (и подчинением!). Тем не менее, откинулся назад. – Mateen Ulhaq 9 April 2018 в 00:58

Как указывали другие, нет правильного способа заказать ваши методы. Возможно, предложение PEP было бы полезно, но в любом случае. Позвольте мне попытаться приблизиться к вашему вопросу как можно объективнее.

  • Интерфейсы сначала: общедоступные методы и магические функции Python определяют интерфейс класса. В большинстве случаев вы и другие разработчики хотите использовать класс, а не изменять его. Таким образом, они будут заинтересованы в интерфейсе этого класса.
  • Свойства magic methods , общедоступные методы. Трудно определить лучший порядок между этими параметрами. три, которые являются частью интерфейса класса. Как говорит @EthanFurman, наиболее важно придерживаться одной системы для всего проекта. Как правило, люди ожидают __init__() лучшей первой функции в классе, поэтому я следую другим магическим методам, указанным ниже.
  • Порядок чтения: В принципе, есть два способа рассказать историю: вверх или вниз. Прежде всего, поставив высокоуровневые функции, разработчик может получить грубое понимание класса, прочитав первые пару строк. В противном случае нужно было бы прочитать весь класс, чтобы получить представление о классе, и большинство разработчиков не имеют на это времени.
  • Методы класса и статические методы: Обычно это объясняется порядком чтения , описанным выше. Обычные методы могут вызывать все методы времени и, таким образом, первыми. Методы класса могут вызывать только методы класса и статические методы и следовать далее. Статические методы не могут вызывать другие методы класса и приходят последними.

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

17
ответ дан Steven Vascellaro 15 August 2018 в 17:22
поделиться
  • 1
    Обычно язык не обеспечивает упорядочение. Но некоторые языки имеют общие соглашения. Например. C # StyleCop имеет строгие правила упорядочения. Для Java см. stackoverflow.com/questions/4668218 и т. Д. – xmedeko 4 May 2017 в 14:13
Другие вопросы по тегам:

Похожие вопросы: