Чем сложнее метод, тем меньше свободы. Придерживаясь методов и правил, мы создаём себе ограничения (Брюс Ли).
Рассмотрим типы методов, создаваемых в классе, их различия и особенности использования. В качестве демонстрационного примера рассмотрим следующий класс:
В теле класса объявлены 3 типа методов - методы класса (декоратор @classmethod), статические методы (@staticmethod) и методы экземпляра (без декоратора). Первые имеют доступ к шаблону класса, его переменным (через первый аргумент), третьи к атрибутам класса и экземпляра (через первый аргумент), а вторые являются обособленными функциями, не имеющими доступ к состоянию класса и его объектов.
Для инициализации экземпляра класса в последующих примерах запишем json файл:
Теперь рассмотрим особенности вызова перечисленных трех типов методов. На самом классе:
from_json как метод класса корректно срабатывает и имеет доступ к переменной класса.
Так же без проблем вызывается статический метод. А вот метод экземпляра использовать на классе не удастся:
Теперь продемонстрируем, что все три метода успешно вызываются созданном выше на экземпляре класса (turkey1):
Последний метод экземпляра класса получается доступ ко всем переменным и класса и экземпляра.
Таким образом методы класса и статические методы можно вызывать на классе или на экземпляре. Методы экземпляра класса - только на созданном объекте. Методы класса имеют доступ к классу и с ними можно обойти ограничение Python на создание только одного конструктора (традиционным методом __init__). Статические методы полезны как независимые от внутреннего состояния класса или его экземпляра функции, которые тем самым становится проще отлаживать.