#python #ооп
Изучал PHP, немного имел дело с С++, начал учить питон и не могу понять одной вещи. Зачем нужен метод класса, если есть статический метод? В чем отличия между ними?
Ответы
Ответ 1
@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__.Ответ 2
@staticmethod: У метода этого типа нет неявной передачи self (объекта), ни неявной передачи cls (класса). Он как обычная функция - только с той разницей, что он вызывается из класса или из объекта. @classmethod: Класс объекта (cls) неявно передается как первый параметр, нет объект сам (self).
Комментариев нет:
Отправить комментарий