Невозможно удалить атрибут, добавленный метаклассом.Python

Программы на Python
Anonymous
Невозможно удалить атрибут, добавленный метаклассом.

Сообщение Anonymous »

Я экспериментировал с метаклассами Python и столкнулся с довольно странным случаем, когда я не могу удалить атрибут, добавленный к объекту класса с помощью метакласса. Рассмотрим следующие два класса:

Код: Выделить всё

class meta(type):

def __new__(mcls, name, bases, attrs):
obj = super().__new__(mcls, name, bases, attrs)
setattr(obj, "temp", "This is temporary")
return obj

def __call__(cls, *args, **kwargs):
obj = type.__call__(cls, *args, **kwargs)
# delattr(obj, "temp")
return obj

class test(metaclass=meta):

def __init__(self):
print(self.temp)
Если я создам экземпляр «тестового» класса, он, как и ожидалось, напечатает «Это временно». Однако, если я раскомментирую оператор delattr в методе __call__, он выдаст ошибку с сообщением о том, что у объекта нет атрибута «temp». Если я удалю оператор delattr и выполню следующее:

Код: Выделить всё

a = test()
print(a.temp)
print(hasattr(a, "temp"))
delattr(a, "temp")
Он будет напечатан:

Код: Выделить всё

This is temporary
This is temporary
True
AttributeError: 'a' object has no attribute 'temp'
Таким образом, он четко распознает наличие атрибута и может напечатать значение атрибута, но не может его удалить. Это ожидаемое поведение?
Если это имеет значение, это Python 3.12

Подробнее здесь: https://stackoverflow.com/questions/786 ... -metaclass

Вернуться в «Python»