self), работают следующим образом:
  self: Первый аргумент метода класса (обычно называемый self) является ссылкой на конкретный экземпляр класса, для которого этот метод вызывается.self.имя_атрибута, метод может читать и изменять атрибуты, принадлежащие этому конкретному экземпляру.Методы класса, которые используют атрибуты экземпляра, работают следующим образом:
__init__ (если он определен).  Внутри __init__, либо в других методах, экземпляру присваиваются атрибуты.  Эти атрибуты хранят данные, специфичные для данного конкретного экземпляра.
    self (но технически может быть назван как угодно, хотя соглашение об использовании self настоятельно рекомендуется).
    self, можно получить доступ к атрибутам этого экземпляра. Например, self.имя_атрибута.  Если атрибут с таким именем существует у экземпляра, возвращается его значение. Если атрибута не существует, обычно возникает ошибка AttributeError.
    Пример:
class Dog:
    species = "Canis familiaris"  # Атрибут класса
    def __init__(self, name, breed):
        self.name = name        # Атрибут экземпляра
        self.breed = breed      # Атрибут экземпляра
        self.tricks = []     # Атрибут экземпляра (пустой список)
    def add_trick(self, trick):
        self.tricks.append(trick)  # Изменение атрибута экземпляра
    def describe(self):
        return f"{self.name} is a {self.breed} and knows: {self.tricks}"
В этом примере:
species - это атрибут класса.name, breed и tricks - это атрибуты экземпляра.add_trick изменяет атрибут экземпляра tricks.describe читает атрибуты экземпляра name, breed и tricks.Таким образом, методы класса, использующие атрибуты экземпляра, позволяют манипулировать данными, специфичными для каждого объекта класса, обеспечивая гибкость и возможность представления различных состояний объектов.