__subclasses__() 是否缓存?

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?

Mar*_*ers 5

不,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)