issubclass() 对从不同路径导入的同一类返回 False

2024-06-21

目的是实现某种插件框架,其中插件是同一基类(即 A)的子类(即 B)。基类使用标准导入加载,而子类使用 imp.load_module() 从众所周知的包(即 pkg)的路径加载。

pkg/
    __init__.py
    mod1.py
        class A
    mod2.py
        class B(pkg.mod1.A)

这很好用real子类,即

# 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 内容的情况下摆脱这个问题?


They aren't同一个班级。它们是使用相同的代码创建的,但由于您执行该代码两次(一次在 import 中,一次在 load_module 中),您会得到两个不同的类对象。issubclass正在比较类对象的身份,它们是不同的。

编辑:因为你不能依赖issubclass,一种可能的替代方法是在基类上创建一个将由派生类继承的唯一属性。该属性也将存在于该类的副本中。然后您可以测试该属性。

class A:
    isA = True

class B(A):
    pass

class C:
    pass

def isA(aclass):
    try:
        return aclass.isA
    except AttributeError:
        return False

print isA(A)
True
print isA(B)
True
print isA(C)
False
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

issubclass() 对从不同路径导入的同一类返回 False 的相关文章

随机推荐