← Назад к вопросам

Отличие classmethod от staticmethod в Python?

1.3 Junior🔥 221 комментариев
#Python

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

classmethod vs staticmethod — ключевые различия

staticmethod и classmethod — это декораторы для методов, которые не требуют доступа к экземпляру класса (self). Но они отличаются тем, есть ли доступ к самому классу.

staticmethod — полная независимость

staticmethod — это просто функция, привязанная к классу. Она не получает ни self, ни cls:

class DataProcessor:
    @staticmethod
    def validate_email(email: str) -> bool:
        return "@" in email

# Можно вызывать из класса или экземпляра
print(DataProcessor.validate_email("user@example.com"))  # True
processor = DataProcessor()
print(processor.validate_email("user@example.com"))  # True

Характеристики:

  • Нет доступа к экземпляру (нет self)
  • Нет доступа к классу (нет cls)
  • Используется для вспомогательных функций
  • Легко тестировать, так как нет зависимостей

classmethod — доступ к классу

classmethod получает класс в качестве первого аргумента (cls). Это позволяет работать с атрибутами класса и создавать альтернативные конструкторы:

class Model:
    model_type = "neural_network"
    
    def __init__(self, name: str):
        self.name = name
    
    @classmethod
    def from_config(cls, config_file: str):
        # Создаём экземпляр через cls, а не через Model
        name = load_name_from_config(config_file)
        return cls(name)
    
    @classmethod
    def info(cls):
        return f"Тип модели: {cls.model_type}"

model = Model.from_config("config.json")
print(Model.info())  # Тип модели: neural_network

Характеристики:

  • Получает класс через cls
  • Может изменять атрибуты класса
  • Может создавать альтернативные конструкторы
  • Важна для наследования: переопределённый cls указывает на дочерний класс

Практический пример с наследованием

class Animal:
    species = "Unknown"
    
    @classmethod
    def create_species(cls, species_name: str):
        return cls(species_name)

class Dog(Animal):
    species = "Canis familiaris"

# classmethod "знает" про наследование
dog = Dog.create_species("Labrador")
print(dog.species)  # Canis familiaris

# staticmethod не может использовать переопределённый класс

Когда использовать?

staticmethod:

  • Вспомогательные функции (валидация, парсинг, расчёты)
  • Логика, не зависящая от состояния класса или экземпляра
  • Примеры: math.sqrt(), str.isdigit()

classmethod:

  • Альтернативные конструкторы (from_dict, from_json, from_file)
  • Работа с атрибутами класса
  • Фабрики для создания объектов
  • Полиморфизм через наследование

Пример из Data Science

class DataLoader:
    cache = {}
    
    @staticmethod
    def validate_path(path: str) -> bool:
        return os.path.exists(path)
    
    @classmethod
    def from_csv(cls, filepath: str):
        if not cls.validate_path(filepath):
            raise FileNotFoundError(f"Файл {filepath} не найден")
        return cls(pd.read_csv(filepath))
    
    @classmethod
    def clear_cache(cls):
        cls.cache.clear()

Вывод: staticmethod для чистых функций, classmethod для альтернативных конструкторов и работы с классом.

Отличие classmethod от staticmethod в Python? | PrepBro