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) |
Нет |
| Доступ к состоянию | Класса | Ни экземпляра, ни класса |
| Основное назначение | Фабричные методы, работа с атрибутами класса | Логическая группировка функций в классе |
| Вызов | Через экземпляр или класс | Через экземпляр или класс |