【发布时间】:2019-10-02 17:14:31
【问题描述】:
我正在通过 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
在创建类B 时,执行上述代码会产生一个AttributeError:
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 on class instance produces unexpected AttributeError 不同,后者试图通过实例删除类变量。相反,我尝试通过类(别名实例)删除类变量(别名实例)。因此,给定的修复在这种情况下不起作用。
EDIT2: olinox14 是对的,是“删除父类属性”的问题。问题可以简化为:
class A:
x = 13
class B(A):
pass
del B.x
【问题讨论】:
-
我很想说这是一个骗子:stackoverflow.com/questions/25054729/…
-
Per quamrana,可能与 delattr on class instance produces unexpected AttributeError 重复——这些类当然是元类的实例。
-
但我不知道如何解决这个错误。
-
@quamrana:啊——这里有一个细微的差别,因为属性存储在对象的 base 上而不是 type 上的对象。但是,基本问题和解决方案是相同的。