«@classmethod преобразует метод в метод класса, что получает класс в качестве неявного первого аргумента, точно так же, как метод экземпляра получает экземпляр».
В данном случае преимущества такие: - Гибкость - разные способы создания объектов - Читаемость - from_string явно показывает источник - Наследование - если создать подкласс, cls автоматически будет указывать на него
class E(С): def method(self): # self подразумевается в super proxy = super() # Эта форма не имеет смысла вне метода print(proxy) # Вывод обычно скрытого промежуточного объекта proxy.act() # Аргументы отсутствуют: неявно вызывает метод суперкласса
print(E().method())»
Пошагово: 1. E().method() создает экземпляр класса E и вызывает его метод method() 2. Внутри method(): - Создается proxy = super() (объект super) - Выводится print(proxy) → <super: <class 'E'>, <E object>> - Вызывается proxy.act() → выводится spam 3. Метод method() завершается без return, поэтому возвращает None
«SystemError: Возникает, когда интерпретатор обнаруживает внутреннюю ошибку, но ситуация не выглядит настолько серьезной, чтобы заставить его потерять всякую надежду».
«ModuleNotFoundError: Подкласс ImportError, который возникает при импорте, когда модуль не может быть найден».
«StopIteration: Вызывается встроенной функцией next() и методом итератора __next__(), чтобы сигнализировать об отсутствии дальнейших созданных итератором элементов».
Форма @staticmethod представляет собой декоратор функции.
Статический метод может быть вызван как для класса (например, C.f()), так и для экземпляра (например, C().f())».
Декораторы позволяют расширять и изменять поведение вызываемых объектов (функций, методов и классов) без постоянного изменения самого вызываемого объекта.
Что происходит: 1. Класс C - пустой базовый класс 2. Класс D наследует от C и имеет __slots__ = ['a'] - это означает, что экземпляры класса D могут иметь только атрибут a 3. X = D() - создается экземпляр класса D 4. X.a = 1 - устанавливается атрибут a (разрешенный слот) 5. X.b = 2 - устанавливается атрибут b (НЕ разрешенный слот)
Почему же в __dict__ только {'b': 2}? Когда вы используете, атрибуты, указанные в __slots__ (в данном случае a) хранятся в специальной структуре данных, а не в __dict__. Атрибуты, НЕ указанные в __slots__ (в данном случае b) хранятся в __dict__ как обычно.
«object.__slots__ ...__slots__ резервирует место для объявленных переменных и предотвращает автоматическое создания dict и weakref для каждого экземпляра».
В задаче выше мы «зафиксировали» список атрибутов и не допускаем добавление ape.
Средство слотов задумывалось как способ отлавливания опечаток.