Короткий ответ
Методы экземпляра первым аргументом получают self, методы класса — cls, а статические методы не получают ни того ни другого. Выбор зависит от того, какие данные нужны методу: экземпляра, класса или никакие.
Как это работает подробнее
- Метод экземпляра. Первым параметром принимает
self— ссылку на конкретный объект — и может читать и менять атрибуты этого экземпляра. - Метод класса. Помечается
@classmethod, первым параметром получаетcls— сам класс — и работает с данными уровня класса. - Альтернативный конструктор. Метод класса может возвращать экземпляры класса и вызывается как от самого класса, так и от экземпляра, в обоих случаях получая правильный класс.
- Статический метод.
@staticmethodне принимает ниself, ниcls— это функция, логически связанная с предметной областью класса, для утилитарных операций.
Пример кода
Три вида методов в одном классе
class Student:
school = 'ABC School'
def display(self, name): # метод экземпляра
print(f'Student: {name}')
@classmethod
def show_school(cls): # метод класса
print(f'School: {cls.school}')
@staticmethod
def is_adult(age): # статический метод
return age >= 18
s = Student()
s.display('Kevin')
Student.show_school()
print(Student.is_adult(20)) # TrueЧто использовать на практике
- Альтернативные конструкторы. Через
@classmethodдобавляй удобные способы создания экземпляров, например из строки или словаря. - Утилиты. Вспомогательные функции, относящиеся к предметной области класса, оформляй как
@staticmethod.