Сравнение 'cls' и 'self' в классах Python: когда и почему использовать

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

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

Вот так выглядит метод экземпляра с self:

Python
Скопировать код
class MyClass:
    def greet(self):
        return f'Привет от экземпляра с id {id(self)}'

А здесь метод класса с cls:

Python
Скопировать код
class MyClass:
    @classmethod
    def identify(cls):
        return f'Привет от класса {cls.__name__}'

Важно помнить: self связан с экземпляром, а cls — с классом.

Кинга Идем в IT: пошаговый план для смены профессии

Детализация параметров

self применяется для:

  • создания объекта с помощью метода __init__;
  • доступа к атрибутам экземпляра;
  • внутренних вызовов методов в рамках данного экземпляра.

cls используется для:

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

Важными аспектами являются читаемость и сопровождаемость кода, согласно рекомендациям PEP 8 лучше использовать стандартные обозначения self и cls.

В глубину магии Python

Манипуляции на уровне класса с cls

cls позволяет функции-фабрике класса формировать основу для создания новых экземпляров:

Python
Скопировать код
class Pizza:
    @classmethod
    def create(cls, size=None, toppings=None):
        if size is None or toppings is None:
            raise ValueError("Указание размера пиццы и начинки обязательно!")
        return cls(size, toppings)

Кастомизация на уровне объекта с self

self напрямую взаимодействует с экземпляром, позволяя настраивать его свойства:

Python
Скопировать код
class Car:
    def paint(self, color):
        self.color = color
        return f'Теперь цвет машины — {self.color}'

Применение cls для подклассов

cls работает с подклассами, предоставляя возможность учитывать их в контексте классов и наследования:

Python
Скопировать код
class Parent:
    @classmethod
    def whoami(cls):
        return f"Я класс: {cls.__name__}"

class Child(Parent):
    pass

print(Child.whoami())  # Вывод: Я класс: Child

Свободное именование согласно конвенции

Несмотря на то, что self и cls являются соглашением о наименовании, Python позволяет использовать любые другие имена, это не сказывается на исполнении кода:

Python
Скопировать код
class Confusion:
    def method(instance):
        print(instance)

    @classmethod
    def anothermethod(klass):
        print(klass)

Визуализация

Класс в Python (или cls) можно рассматривать как чертеж, изображая на нем готовые экземпляры (или self):

Markdown
Скопировать код
Чертеж (📖): Описывается с помощью 'cls' и дает задел для будущего продукта.

Изделие (📦): Представляет себя с помощью 'self'.
Python
Скопировать код
class Blueprint:
    @classmethod
    def create_product(cls):
        return cls()  # из чертежа получаем продукт

product = Blueprint()
product.paint_self('красный')  # Продукт готов к использованию!

Сочетая cls для создания и self для детализации каждого экземпляра, мы обеспечиваем полноценное взаимодействие с объектами.

Markdown
Скопировать код
📖 – "Пришло время создать новый 📦."
📦 – "Вот и я, этот 📦, и я особенный!"

Контекстуализация использования

Изменения на уровне класса и экземпляра

cls применяют для внесения изменений, относящихся ко всему классу, тогда как self предназначен для взаимодействия с конкретным экземпляром. Понимание этого нюанса помогает эффективнее масштабировать код.

Статические методы — отдельный случай

Помимо cls и self следует упомянуть @staticmethod, который не привязан к контексту экземпляра или классу и подходит для вспомогательных функций.

Переопределение методов у классов-наследников

На уровне подклассов cls позволяет переопределить методы базового класса, таким образом, реализуя специфическую функциональность. Через super() удается поддерживать связь с родительским методом.

Практические применения

cls и self приносят разнообразие в программирование на Python:

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

Освоив эти и другие аспекты, вы сможете эффективнее работать с объектно-ориентированным программированием на Python.

Полезные материалы

  1. Официальная документация Python содержит ценные сведения о классах и использовании self.
  2. Кори Шейфер подробно освещает тему classmethods и staticmethods на своем канале YouTube, полезно посмотреть для понимания self и cls.
  3. Real Python разбирает различные виды методов и рассказывает о применении cls.
  4. GeeksforGeeks помогает различать @classmethod и @staticmethod.
  5. DigitalOcean объясняет классовые и экземплярные переменные в Python 3.
  6. Toptal предлагает всесторонний гид по self и cls.
  7. Узнайте больше о методе __init__ и переменной self благодаря материалам DigitalOcean.