python - 删除现有的类变量 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
解决方案
似乎python将x
变量注册为A类的参数:
然后,当您尝试从类中删除它时,与该方法B
存在一些冲突,就像@David Herring 提供的链接中提到的那样......delattr
一种解决方法可能是从A
类中显式删除参数:
delattr(A, "x")
推荐阅读
- php - 如果我想在表中的不同名称之间添加一个空行怎么办
- jquery - 带有 httppost、ValidateAntiForgeryToken 的 jQuery ajax
- spring - SimpleMessageListenerContainer 中的堆空间错误
- android - 如何在android中的配置更改上保留动态添加的edittext的文本
- javascript - Node.js如何按索引拆分查询字符串值
- node.js - 猫鼬查询中是否有相当于 Promise.all 的内容?
- android - 如何在 Flutter 中为未选择的选项卡添加下划线?
- google-bigquery - 如何在 BigQuery 中构建模块化查询?
- ruby-on-rails - 多线程 Sneaker 中的对象变量就像全局可变数据一样工作
- .net - c# 中的 DbSet 必须有 virtual 关键字