Изучал 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__.
Комментариев нет:
Отправить комментарий