issubclass()返回从不同路径导入的同一类的Flase [英] issubclass() returns Flase on the same class imported from different paths

查看:226
本文介绍了issubclass()返回从不同路径导入的同一类的Flase的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

使用真实子类,即

 #test_1.py 
import pkg
来自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 ,mod1.A))#True

但是测试基类本身时出现问题, p>

 #test_2.py 
import pkg
从pkg import mod1
import imp

print(issubclass('mod1',tup [0],tup [1],tup [2])
mod0 = imp.find_module (mod0.A,mod1.A))#False

但是mod0.A和mod1.A实际上来自同一个文件(pkg / mod1.py)的同一个类。



这个问题出现在python 2.7和3.2。



现在问题是双重的,a)它是一个预期的功能或者issubclass()的错误,和b)如何摆脱这个而不改变pkg的内容?



感谢。

解决方案

他们 。它们是用相同的代码创建的,但是因为你执行了两次代码(一次在导入,一次在load_module),你得到两个不同的类对象。 issubclass 正在比较类对象的身份,它们是不同的。



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

  A类:
isA = True

类B(A):
pass

class C:
pass

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

print isA(A)
True
打印isA(B)
True
print isA(C)
False


The intention was to implement some sort of plugin framework, where plugins are subclasses (i.e. B) of the same base class (i.e. A). The base class is loaded with standard import, whereas subclasses are loaded with imp.load_module() from the path of a well-known package (i.e. pkg).

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

This worked fine with real subclasses, i.e.,

# 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

But the problem came when testing the base class itself,

# 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

But mod0.A and mod1.A are actually the same class from the same file (pkg/mod1.py).

This issue appears in both python 2.7 and 3.2.

Now the question is two-fold, a) Is it an expected feature or a bug of issubclass(), and b) How to get rid of this without changing contents of pkg?

Thanks.

解决方案

They aren't the same class. They were created with the same code, but since you executed that code twice (once in the import and once in load_module) you get two different class objects. issubclass is comparing the identities of the class objects and they're different.

Edit: since you can't rely on issubclass, one possible alternative is to create a unique attribute on the base class that will be inherited by the derived classes. This attribute will exist on copies of the class as well. You can then test for the attribute.

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

这篇关于issubclass()返回从不同路径导入的同一类的Flase的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆