alx*_*wrd 5 python class subclass python-3.x
从类继承时,子类可以通过.__subclasses__()方法在父类上访问。
class BaseClass:
pass
class SubClass(BaseClass):
pass
BaseClass.__subclasses__()
# [<class '__main__.SubClass'>]
Run Code Online (Sandbox Code Playgroud)
但是,删除子类似乎并没有将它从父类中删除。
del SubClass
BaseClass.__subclasses__()
# [<class '__main__.SubClass'>]
Run Code Online (Sandbox Code Playgroud)
__subclasses__得到它的信息?我可以操纵它吗?或者
BaseClass.remove_subclass(SubClass)?子类在内部包含对其自身的引用,因此它会继续存在,直到被垃圾收集为止。如果强制执行垃圾收集周期,它将从以下位置消失__subclasses__():
import gc
gc.collect()
Run Code Online (Sandbox Code Playgroud)
然后它就消失了。
但是,请确保在强制垃圾回收之前已删除对该类的所有其他引用。例如,如果您以交互方式执行此操作,并且最后的输出是子类列表,则仍然会在_.
class BaseClass:
pass
class SubClass(BaseClass):
pass
print(BaseClass.__subclasses__())
# [<class '__main__.SubClass'>]
del SubClass
import gc
gc.collect()
print(BaseClass.__subclasses__())
# []
Run Code Online (Sandbox Code Playgroud)
python 3.7 的输出是:
[<class '__main__.SubClass'>]
[]
Run Code Online (Sandbox Code Playgroud)
我可能还应该补充一点,虽然垃圾收集适用于这个简单的情况,但您可能不应该在现实生活中依赖它:很容易意外地在代码中的某个地方保留对子类的引用,然后想知道为什么该类永远不会消失。
您在这里尝试做的是保留子类的注册表,以便工厂可以返回适当类的对象。如果您希望能够在注册表中添加和删除类,那么我认为您必须明确。您仍然可以用来__subclasses__查找候选类,但在每个类上保留一个标志以显示它是否已启用。然后,不要只删除子类,而是设置标志以显示该类不再使用,然后(如果需要)删除它。
| 归档时间: |
|
| 查看次数: |
716 次 |
| 最近记录: |