Страницы

Поиск по вопросам

среда, 28 ноября 2018 г.

В чем отличие статического метода(@staticmethod) и метода класса (@classmethod). Python

Изучал PHP, немного имел дело с С++, начал учить питон и не могу понять одной вещи. Зачем нужен метод класса, если есть статический метод? В чем отличия между ними?


Ответ

@staticmethod определяет обычную функцию в пространстве имён класса. Может быть полезно для вспомогательных _* функций, чтобы не мусорить пространство имён модуля.
@classmethod создаёт метод класса. Объект класса явно передаётся через первый параметр как это с параметром self происходит для обычных методов. Также как и для self, переданный cls может отличаться от класса, в котором определён класс-метод (может быть потомок). Часто используется для создания альтернативных конструкторов (ArgumentParser.from_params()):
>>> from collections import OrderedDict >>> OrderedDict.fromkeys("abc") OrderedDict([('a', None), ('b', None), ('c', None)]) >>> import datetime as DT >>> DT.datetime.now() datetime.datetime(2018, 2, 3, 18, 52, 8, 43534)
Исключение __new__ метод, который является статическим (хотя @staticmethod не используется), а не класс-методом. Why isn't __new__ in Python new-style classes a class method?. Есть __init_subclass__, который является класс-методом, но не объявляется как таковой.
@classmethod участвуют в нескольких встроенных протоколах Питона, к примеру, issubclass(klass, Divisible) вызывает Divisible.__subclasshook__.

Комментариев нет:

Отправить комментарий