如何从 __subclasses__ 中删除类?

2024-04-29

当从类继承时,子类可以通过父类访问.__subclasses__() method.

class BaseClass:
    pass

class SubClass(BaseClass):
    pass

BaseClass.__subclasses__()
# [<class '__main__.SubClass'>]

但是,删除子类似乎并没有将其从父类中删除。

del SubClass

BaseClass.__subclasses__()
# [<class '__main__.SubClass'>]
  • 哪里有__subclasses__从哪里获取其信息?我可以操纵它吗?

Or

  • 是否有适当的方法来删除一个类并使其父级失去对它的引用(例如BaseClass.remove_subclass(SubClass)?

子类在内部包含对其自身的引用,因此它会继续存在,直到被垃圾收集为止。如果你强制进行垃圾收集周期,它就会从__subclasses__():

import gc
gc.collect()

然后它就消失了。

但是,请确保在强制垃圾回收之前已删除对该类的所有其他引用。例如,如果您以交互方式执行此操作,并且最后的输出是子类列表,则仍然会存在对该类的引用_.

class BaseClass:
    pass

class SubClass(BaseClass):
    pass

print(BaseClass.__subclasses__())
# [<class '__main__.SubClass'>]
del SubClass

import gc
gc.collect()
print(BaseClass.__subclasses__())
# []

python 3.7 的输出是:

[<class '__main__.SubClass'>]
[]

我可能还应该补充一点,虽然垃圾收集适用于这个简单的情况,但您可能不应该在现实生活中依赖它:很容易意外地在代码中的某个地方保留对子类的引用,然后想知道为什么该类永远不会消失。

您在这里尝试做的是保留子类的注册表,以便工厂可以返回适当类的对象。如果您希望能够在注册表中添加和删除类,那么我认为您必须明确。你仍然可以使用__subclasses__查找候选类,但在每个类上保留一个标志以显示它是否已启用。然后,不要只删除子类,而是设置标志以显示该类不再使用,然后(如果需要)删除它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 __subclasses__ 中删除类? 的相关文章

随机推荐