Чем отличаются декораторы classmethod и staticmethod?
Этот вопрос проверяет знание различий между двумя декораторами в Python: classmethod и staticmethod, а также их назначение и поведение.
Короткий ответ
- classmethod получает в качестве первого аргумента сам класс (по умолчанию cls), а не экземпляр. Он используется для методов, которые работают с классом, а не с объектами.
- staticmethod не получает ни класс, ни экземпляр в качестве первого аргумента и работает как обычная функция, которая логически связана с классом.
Длинный ответ
- classmethod: Декоратор classmethod используется для того, чтобы метод мог работать с классом, а не с экземпляром. Это полезно, когда нужно создавать методы, которые касаются всего класса, а не конкретных объектов. Такой метод принимает первым аргументом сам класс (обычно его называют cls), а не экземпляр класса.
Пример с classmethod:
class MyClass:
count = 0
def __init__(self):
MyClass.count += 1
@classmethod
def get_count(cls):
return cls.count
obj1 = MyClass()
obj2 = MyClass()
print(MyClass.get_count()) # Выведет 2
- staticmethod: Декоратор staticmethod используется, когда метод не зависит ни от класса, ни от экземпляра. Это обычная функция, которая логически привязана к классу, но не использует его атрибуты и методы. Такой метод не принимает ни self, ни cls в качестве первого аргумента.
Пример с staticmethod:
class MyClass:
@staticmethod
def greet(name):
return f"Hello, {name}"
print(MyClass.greet("Alice")) # Выведет "Hello, Alice"
Основное различие: classmethod работает с классом и его атрибутами, а staticmethod — это обычная функция, которая может быть вызвана как часть класса, но не имеет доступа к его атрибутам или методам.