目的是实现某种插件框架,其中插件是同一基类(即 A)的子类(即 B)。基类使用标准导入加载,而子类使用 imp.load_module() 从知名包(即 pkg)的路径加载。
pkg/
__init__.py
mod1.py
class A
mod2.py
class B(pkg.mod1.A)
这适用于真正的子类,即
# test_1.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod2', pkg.__path__)
mod2 = imp.load_module('mod2', tup[0], tup[1], tup[2])
print(issubclass(mod2.B, mod1.A)) # True
但是在测试基类本身的时候问题就来了,
# test_2.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod1', pkg.__path__)
mod0 = imp.load_module('mod1', tup[0], tup[1], tup[2])
print(issubclass(mod0.A, mod1.A)) # False
但是 mod0.A 和 mod1.A 实际上是来自同一个文件 (pkg/mod1.py) 的同一个类。
这个问题出现在 python 2.7 和 3.2 中。
现在问题有两个方面,a) 它是预期的特性还是 issubclass() 的错误,以及 b) 如何在不改变 pkg 内容的情况下摆脱这个问题?