gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:35:11 24 4
gpt4 key购买 nike

目的是实现某种插件框架,其中插件是同一基类(即 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 内容的情况下摆脱它?

最佳答案

他们不是同一个类(class)。它们是用相同的代码创建的,但是由于您执行了该代码两次(一次在导入中,一次在加载模块中),您会得到两个不同的类对象。 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

关于python - issubclass() 对从不同路径导入的同一类返回 False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11461356/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com