当从类继承时,子类可以通过父类访问.__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(使用前将#替换为@)