
Методы классов в Python позволяют создавать логику, привязанную к самому классу, а не к его экземплярам. Они объявляются с помощью декоратора @classmethod и первым аргументом получают cls – ссылку на сам класс. Это делает их удобными для создания фабричных методов, альтернативных конструкторов и работы с общими для всех объектов данными.
В отличие от обычных методов экземпляра, которые используют self для доступа к конкретному объекту, методы класса обращаются к атрибутам уровня класса. Это полезно, когда нужно контролировать процесс создания объектов, автоматически изменять параметры для новых экземпляров или реализовывать паттерны проектирования, такие как Singleton.
Чтобы вызвать метод класса, достаточно обратиться к нему через имя класса, например: MyClass.my_class_method(). Такой вызов делает код прозрачным – сразу видно, что метод работает с классом, а не с конкретным объектом. Это упрощает чтение и поддержку программы.
Дальнейшие примеры покажут, как создавать методы класса, использовать их для инициализации объектов с разными параметрами и изменять поведение программы без дублирования кода.
Создание простого класса и метода

- Определите класс с помощью ключевого слова
class. - Создайте метод, принимающий
self. - Создайте экземпляр класса и вызовите метод через точку.
Пример:
class Car:
def start(self):
print("Двигатель запущен")
my_car = Car()
my_car.start()
Car– имя класса.start– метод, доступный для каждого экземпляра.my_car.start()вызывает метод и выполняет код внутри него.
Рекомендуется называть методы глаголами, отражающими действие, и использовать self только как первый параметр для доступа к данным объекта.
Вызов метода через экземпляр класса
Пример:
class Калькулятор:
def умножить(self, x, y):
return x * y
calc = Калькулятор()
результат = calc.умножить(3, 4)
print(результат) # 12
В этом примере calc – экземпляр класса, а умножить вызывается с передачей аргументов. self передается автоматически, вручную его указывать не нужно.
Сравнение вызова методов через экземпляр и напрямую через класс:
| Способ вызова | Синтаксис | Особенности |
|---|---|---|
| Через экземпляр | экземпляр.метод(...) |
Удобен, self передается автоматически |
| Через класс | Класс.метод(экземпляр, ...) |
Необходима явная передача экземпляра |
Рекомендация: используйте вызов через экземпляр для повышения читаемости и предотвращения ошибок, связанных с пропуском self.
Передача аргументов в метод

Методы класса принимают аргументы так же, как обычные функции. Первый параметр всегда self – ссылка на объект, остальные задаются по необходимости.
Пример с одним аргументом:
class User:
def greet(self, name):
return f"Привет, {name}!"
u = User()
print(u.greet("Анна")) # Привет, Анна!
Можно использовать несколько аргументов:
class Math:
def add(self, x, y):
return x + y
m = Math()
print(m.add(3, 7)) # 10
Для значений по умолчанию укажите их прямо в определении метода:
class Car:
def move(self, speed=60):
return f"Еду со скоростью {speed} км/ч"
c = Car()
print(c.move()) # Еду со скоростью 60 км/ч
print(c.move(90)) # Еду со скоростью 90 км/ч
Если число аргументов заранее неизвестно, применяйте *args и **kwargs:
class Logger:
def log(self, *msgs, **data):
print(" | ".join(msgs), data)
l = Logger()
l.log("Ошибка", "Код 404", user="admin")
Всегда определяйте порядок: сначала self, затем позиционные, потом *args, именованные и **kwargs. Это предотвращает конфликты при вызове метода.
Использование методов класса с декоратором @classmethod

@classmethod связывает метод с классом, а не с конкретным экземпляром. Первый аргумент таких методов – cls, представляющий сам класс. Это удобно для создания альтернативных конструкторов и работы с общими для всех объектов данными.
Пример альтернативного конструктора:
class User:
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def from_string(cls, data):
name, age = data.split(',')
return cls(name, int(age))
u = User.from_string("Анна,30")
print(u.name, u.age)
Метод from_string принимает строку, разбирает её и возвращает готовый объект. Такой подход упрощает парсинг данных из файлов и API.
Используйте @classmethod, если логика должна работать с самим классом: например, для подсчёта созданных объектов:
class Counter:
count = 0
def __init__(self):
Counter.count += 1
@classmethod
def total(cls):
return cls.count
Counter()
Counter()
print(Counter.total())
Метод total обращается к cls.count и подходит для статистики или кэширования.
Рекомендация: применяйте @classmethod там, где нужно оперировать классом и его атрибутами, а не состоянием отдельных объектов.
Разница между методами экземпляра, класса и статическими методами

Методы экземпляра принимают первым аргументом self – ссылку на конкретный объект. Они работают с его атрибутами и изменяют состояние только этого объекта. Пример:
class User:
def __init__(self, name):
self.name = name
def greet(self):
return f"Привет, {self.name}!"
u = User("Анна")
print(u.greet()) # Привет, Анна!
Методы класса используют cls вместо self и воздействуют на сам класс. Их удобно применять для создания альтернативных конструкторов или изменения общих настроек. Пример:
class User:
users_count = 0
def __init__(self, name):
self.name = name
User.users_count += 1
@classmethod
def total_users(cls):
return cls.users_count
print(User.total_users()) # 1
Статические методы не получают ссылок ни на экземпляр, ни на класс. Их используют для вспомогательных функций, связанных с логикой класса, но не зависящих от его состояния.
class MathUtils:
@staticmethod
def add(a, b):
return a + b
print(MathUtils.add(3, 5)) # 8
Рекомендации: используйте методы экземпляра для работы с конкретным объектом, методы класса – для управления состоянием класса или создания новых объектов, статические методы – для изолированной логики, не зависящей от данных класса.
Вызов метода класса внутри другого метода
В Python метод одного класса можно вызвать внутри другого метода того же класса через ключевое слово self. Это позволяет использовать уже реализованную логику без дублирования кода. Например, если есть метод, выполняющий базовую проверку, другой метод может использовать его для валидации данных перед основной обработкой.
Пример:
class Calculator:
def validate(self, value):
return isinstance(value, (int, float))
def add(self, a, b):
if self.validate(a) and self.validate(b):
return a + b
raise ValueError("Оба значения должны быть числами")
В примере метод add вызывает validate через self.validate(), обеспечивая повторное использование логики проверки типов. Такой подход снижает вероятность ошибок при изменении алгоритмов валидации.
Для вызова методов класса, объявленных как @classmethod, используется ссылка через cls вместо self. Это важно при работе с альтернативными конструкторами или методами, которые зависят от состояния класса, а не конкретного объекта.
Пример с @classmethod:
class Item:
base_price = 100
@classmethod
def get_base_price(cls):
return cls.base_price
@classmethod
def discounted_price(cls, discount):
return cls.get_base_price() * (1 - discount)
Метод discounted_price повторно использует get_base_price, что позволяет централизованно управлять значением base_price и уменьшает риск несогласованности данных.
Рекомендуется всегда вызывать методы через self или cls, а не напрямую через имя класса, чтобы сохранить гибкость кода при наследовании и переопределении методов.
Вопрос-ответ:
Что такое метод класса в Python и чем он отличается от обычного метода?
Метод класса — это функция внутри класса, которая принимает первым параметром сам класс (обычно называют его cls), а не объект экземпляра. В отличие от обычного метода, который работает с конкретным экземпляром и получает доступ к его атрибутам через self, метод класса может изменять атрибуты класса или создавать новые экземпляры. Пример использования: если нужно хранить общий счетчик всех созданных объектов, логичнее использовать метод класса.
Как правильно вызвать метод класса без создания экземпляра?
Метод класса можно вызвать напрямую через имя класса. Для этого нужно указать имя класса, точку и имя метода. Параметр cls передается автоматически. Например, если есть класс Animal с методом класса create_default, можно вызвать Animal.create_default(). Это удобно, когда нужно выполнить действие, связанное с самим классом, а не с конкретным объектом.
Можно ли вызывать метод класса из обычного метода экземпляра?
Да, можно. Внутри метода экземпляра можно обратиться к методу класса через self.__class__. Это позволит использовать функционал метода класса для текущего объекта или для работы с атрибутами самого класса. Такой подход часто применяется, если часть логики связана с общими данными класса, а не только с конкретным экземпляром.
Как метод класса работает с атрибутами класса?
Метод класса получает ссылку на сам класс через параметр cls, поэтому он может читать и изменять переменные, объявленные на уровне класса. Например, если класс хранит счетчик всех объектов, метод класса может увеличивать этот счетчик при создании нового экземпляра. Это позволяет централизованно управлять данными, общими для всех объектов.
В чем преимущество использования методов класса для создания объектов?
Методы класса часто используют для создания альтернативных конструкторов. Вместо того чтобы напрямую вызывать __init__, можно определить метод класса, который формирует объект с заранее установленными значениями или определенной логикой. Такой подход упрощает код, делает его более читаемым и позволяет создавать разные виды объектов одного класса без дублирования кода.
