ils*_*005 3 python inheritance sys
我在三个不同的文件中有三个模型。模块都在sys.path
a.py:
class A(object):
pass
b.py:
class B(A):
passs
c.py:
class C(A):
pass
Run Code Online (Sandbox Code Playgroud)
现在我想获取 A 的子类:
print A.__subclasses__()
>> [<class 'b.B'>, <class 'c.C'>]
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。但是现在我从我的 sys.path 中删除 c.py 并再次获取子类。我想除了,只会B剩下。但输出是一样的:
# remove c.py from sys.pyth
sys.path.remove('../c')
print A.__subclasses__()
>> [<class 'b.B'>, <class 'c.C'>]
Run Code Online (Sandbox Code Playgroud)
所以以某种方式__subclasses__调用被缓存。是否可以强制__subclasses__再次搜索 sys.path?
不,class.__subclasses__()不是缓存,不是真的;内部实现使用弱引用。但是模块是;删除c.py文件不会卸载模块。
您也必须删除该模块:
import sys
del sys.modules['c']
Run Code Online (Sandbox Code Playgroud)
并确保没有对该模块的其他引用。
因为类本身涉及很多引用(它们指向它们的基类,对于初学者)您需要确保运行gc.collect()以确保删除的类对象不再保留在内存中:
>>> class B(A): pass
...
>>> A.__subclasses__()
[<class '__main__.B'>]
>>> del B
>>> A.__subclasses__()
[<class '__main__.B'>]
>>> gc.collect(0)
0
>>> gc.collect(1)
3
>>> gc.collect(1)
0
>>> gc.collect(2)
0
>>> A.__subclasses__()
[]
Run Code Online (Sandbox Code Playgroud)