首页 > 解决方案 > 删除现有的类变量 yield AttributeError

问题描述

我正在通过 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

标签: pythonmetaclass

解决方案


似乎python将x变量注册为A类的参数:

捕获

然后,当您尝试从类中删除它时,与该方法B存在一些冲突,就像@David Herring 提供的链接中提到的那样......delattr

一种解决方法可能是从A类中显式删除参数:

delattr(A, "x")

推荐阅读