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

В чем разница между classmethod, staticmethod и обычным методом?

1️⃣ Как кратко ответить

В Python обычные методы принимают первым аргументом self, что позволяет им работать с экземпляром класса. classmethod принимает первым аргументом cls, что позволяет работать с самим классом, а не с его экземпляром. staticmethod не принимает ни self, ни cls, и ведет себя как обычная функция, но находится в пространстве имен класса.

2️⃣ Подробное объяснение темы

В Python методы внутри класса могут быть трех типов: обычные методы, методы класса (classmethod) и статические методы (staticmethod).

Обычные методы

Обычные методы — это методы, которые принимают первым аргументом self. Этот аргумент представляет собой экземпляр класса, и через него метод может получить доступ к атрибутам и другим методам этого экземпляра.

class Dog:
    def __init__(self, name):
        self.name = name
​
    def bark(self):
        return f"{self.name} says woof!"

В этом примере метод bark является обычным методом. Он использует self для доступа к атрибуту name экземпляра Dog.

Методы класса (classmethod)

Методы класса принимают первым аргументом cls, который представляет сам класс, а не его экземпляр. Это позволяет методам класса изменять состояние класса или создавать новые экземпляры класса.

Чтобы объявить метод класса, используется декоратор @classmethod.

class Dog:
    species = "Canis lupus familiaris"
​
    def __init__(self, name):
        self.name = name
​
    @classmethod
    def get_species(cls):
        return cls.species

В этом примере метод get_species является методом класса. Он использует cls для доступа к атрибуту species класса Dog.

Статические методы (staticmethod)

Статические методы не принимают ни self, ни cls в качестве первого аргумента. Они ведут себя как обычные функции, но находятся в пространстве имен класса. Статические методы полезны, когда вам нужна функция, связанная с классом, но не зависящая от состояния класса или его экземпляров.

Чтобы объявить статический метод, используется декоратор @staticmethod.

class MathOperations:
    @staticmethod
    def add(x, y):
        return x + y

В этом примере метод add является статическим методом. Он не зависит от состояния класса MathOperations и может быть вызван без создания экземпляра класса.

Зачем это нужно и где применяется?

  • Обычные методы используются, когда нужно работать с данными конкретного экземпляра класса. Например, если у вас есть объект Dog, и вы хотите, чтобы он лаял, вы вызовете метод bark.

  • Методы класса полезны, когда нужно работать с самим классом, например, для изменения атрибутов класса или создания новых экземпляров. Это может быть полезно в паттернах проектирования, таких как фабричные методы.

  • Статические методы применяются, когда функция логически связана с классом, но не требует доступа к его состоянию. Это может быть полезно для утилитарных функций, которые имеют смысл в контексте класса.

Тема: ООП
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки