Sobes.tech
Middle
120
questionbank

В чем различия между декораторами @classmethod и @staticmethod в Python?

AI答案

sobes.tech AI

@classmethod принимает первым аргументом ссылку на класс (cls), автоматически передаваемую интерпретатором при вызове. Используется для создания фабричных методов или методов, работающих с атрибутами класса.

@staticmethod не принимает неявно первым аргументом ни класс, ни экземпляр. По сути, это обычная функция, определенная внутри класса, для логической группировки. Не имеет доступа к состоянию экземпляра или класса.

class MyClass:
    count = 0

    def __init__(self, value):
        self.value = value
        MyClass.count += 1

    @classmethod
    def create_from_value(cls, value):
        # Метод класса, имеет доступ к классу MyClass через cls
        return cls(value)

    @staticmethod
    def display_info(item):
        # Статический метод, не имеет доступа к классу или экземпляру
        print(f"Значение объекта: {item.value}")

# Использование
obj1 = MyClass(10)
obj2 = MyClass.create_from_value(20) # Вызов через метод класса

MyClass.display_info(obj1) # Вызов статического метода
# MyClass.display_info(MyClass) # Не работает, если метод ожидает экземпляр
Характеристика @classmethod @staticmethod
Первый аргумент Ссылка на класс (cls) Нет
Доступ к состоянию Класса Ни экземпляра, ни класса
Основное назначение Фабричные методы, работа с атрибутами класса Логическая группировка функций в классе
Вызов Через экземпляр или класс Через экземпляр или класс