Я манипулирую созданием классов через метаклассы Python. Однако, хотя у класса есть атрибут благодаря его родителю, я не могу удалить его.
class Meta(type):
def __init__(cls, name, bases, dct):
super().__init__(name, bases, dct)
if hasattr(cls, "x"):
print(cls.__name__, "has x, deleting")
delattr(cls, "x")
else:
print(cls.__name__, "has no x, creating")
cls.x = 13
class A(metaclass=Meta):
pass
class B(A):
pass
Выполнение вышеуказанного кода дает AttributeError
при создании класса B
:
A has no x, creating
B has x, deleting
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-3-49e93612dcb8> in <module>()
10 class A(metaclass=Meta):
11 pass
---> 12 class B(A):
13 pass
14 class C(B):
<ipython-input-3-49e93612dcb8> in __init__(cls, name, bases, dct)
4 if hasattr(cls, "x"):
5 print(cls.__name__, "has x, deleting")
----> 6 delattr(cls, "x")
7 else:
8 print(cls.__name__, "has no x, creating")
AttributeError: x
Почему я не могу удалить существующий атрибут?
РЕДАКТИРОВАТЬ: Я думаю, что мой вопрос отличается от delattr на экземпляре класса приводит к неожиданному AttributeError , который пытается удалить переменную класса через экземпляр. Напротив, я пытаюсь удалить переменную класса (экземпляр псевдонима) через класс (экземпляр псевдонима). Таким образом, данное исправление НЕ работает в этом случае.
EDIT2: olinox14 прав, это проблема «удалить атрибут родительского класса». Проблема может быть уменьшена до:
class A:
x = 13
class B(A):
pass
del B.x