Пример:
class MyClass: def instance_method(self): print(f"Экземпляр: {self}") @classmethod def class_method(cls): print(f"Класс: {cls.__name__}") @staticmethod def static_method(): print("Просто функция") obj = MyClass() obj.instance_method() # self — это obj MyClass.class_method() # cls — это MyClass MyClass.static_method() # self/cls нет
Частый вопрос:
Можно ли вызвать класс-метод через экземпляр? Чем это отличается от вызова через сам класс?
Ответ: Да, класс-метод можно вызывать и через экземпляр, и через сам класс. Не важно, откуда вызов — первым аргументом всегда будет класс, а не экземпляр. При вызове через экземпляр передается его класс в качестве cls.
История
В проекте все фабричные методы сделали статическими (@staticmethod), но внутри нужно было узнать имя класса-потомка — это оказалось невозможно. Исправили на @classmethod, чтобы получать cls-ссылку.
История
Для генерации уникальных айдишников экземпляров использовали обычный метод (self), а надо было класс-метод, так как счетчик должен быть общим для класса, а не для каждого объекта.
История
Разработчик поместил бизнес-логику, не связанную с классом, в статический метод внутри класса. Другие не смогли найти эту функцию, потому что не ожидали её в пространстве другого класса, что усложнило сопровождение.