Я хочу упорядочить методы в классе Python, но не знаю, какой порядок правильный.
Когда я извлекаю методы в Eclipse с помощью PyDev, Eclipse помещает извлеченный метод поверх измененного. Но при этом детали более низкого уровня ставятся перед деталями более высокого уровня. По словам дяди Боба, я должен сделать обратное, чтобы мой код читался как заголовки газет. Когда я программирую на Java, я просто следую его совету.
Что лучше всего подходит для Python?
Ответы:
Как отмечали другие, нет правильного способа упорядочить ваши методы. Может быть, предложение PEP было бы полезно, но все равно. Попробую подойти к вашему вопросу максимально объективно.
Сначала интерфейсы: общедоступные методы и магические функции Python определяют интерфейс класса. В большинстве случаев вы и другие разработчики хотите использовать класс, а не изменять его. Таким образом, они будут заинтересованы в интерфейсе этого класса. Помещение его первым в исходном коде позволяет избежать прокрутки деталей реализации, которые вам не нужны.
Свойства, магические методы , общедоступные методы: трудно определить лучший порядок между этими тремя, которые являются частью интерфейса класса. Как говорит @EthanFurman, очень важно придерживаться одной системы для всего проекта. Как правило, люди ожидают
__init__()
лучшей первой функции в классе, поэтому я использую другие магические методы прямо ниже.Порядок чтения: в основном есть два способа рассказать историю: снизу вверх или сверху вниз. Ставя на первое место высокоуровневые функции, разработчик может получить общее представление о классе, прочитав первые пару строк. В противном случае, чтобы получить какое-либо представление о классе, пришлось бы прочитать весь класс, а у большинства разработчиков нет на это времени. Как правило, ставьте методы выше всех методов, вызываемых из их тела.
Методы класса и статические методы: обычно это подразумевается порядком чтения, описанным выше. Обычные методы могут вызывать все методы раз и, следовательно, быть первыми. Методы класса могут вызывать только методы класса и статические методы и далее. Статические методы не могут вызывать другие методы класса и идти последними.
Надеюсь это поможет. Кстати, большинство этих правил не относятся к Python. Я не знаю языка, который обеспечивает порядок методов, но если это так, это было бы довольно интересно, и, пожалуйста, прокомментируйте.
источник
__init__
явно (в сочетании с__new__
) или неявно (через конструктор по умолчанию), так что это может быть причиной их размещения вместе с__init__
. (Хотя я никогда не видел , как они размещены перед__init__
тем .)Нет одного правильного порядка. Выберите систему и придерживайтесь ее. Я использую:
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"
источник
@staticmethod
,@classmethod
,@property
и любые другие@decorator
строки , поэтому я использую тип метода , чтобы определить , где он идет (за исключением того, что свойства имеют тенденцию идти между_private_methods
иnormal_methods
).@classmethod
s come next (@classmethod def a_class_method(cls)
), а затем@staticmethod
s (@staticmethod def a_static_method()
)? По крайней мере,Я делаю что-то похожее на @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"
Очевидно, это менее полезно для небольших классов.
источник
####
блоки, когда понял, что вы поместили их туда специально! Однако я согласен с порядком , о чем и идет речь. Я бы рекомендовал удалить####
из этого примера, поскольку он не относится к сфере действия вопроса, а ваш пример относится к небольшому классу, для которого вы все равно не будете использовать####
. :-)