口译员认为同一类的2个声明是不同的

时间:2016-06-14 22:30:52

标签: python python-2.7 class

基本上我有一个项目设置如下:

<container-folder>
        |- <folder_1>
               |- <extra_folder>
               |        |- source.py
               |
               |- main.py

main.py中,我声明了一个类似的类:

class ClassOne:
    pass

main.py的另一个方法中,我有以下代码:

result = source_function()
if not isinstance(result, ClassOne):
    print "failed!"

source.py中,我定义了

import container-folder.folder_1.main
...
def source_function():
    return main.ClassOne()

但是,我仍然打印出"failed!"。在调试器中进行检查时,我有点奇怪的意外:

result被标记为container-folder.folder_1.main.ClassOne类型,ClassOne具有签名main.ClassOne。为什么这两个不被认为是平等的?

我还注意到,如果我将代码更改为以下内容,请使用其完全限定的类名:

if not isinstance(result, container-folder.folder_1.main.ClassOne):

我获得了预期的成功。

1 个答案:

答案 0 :(得分:0)

他们不是同一个班级。这是因为当你运行python模块(即python main.py)时,它会以__main__运行。因此,您有__main__.SomeClass(来自程序的根模块)和main.SomeClass(来自source导入的模块),它们是来自不同模块的不同类。

要解决您的问题,最好将课程移至另一个模块,并从第三个模块中同时拥有mainsource导入SomeClass

从技术上讲,你也可以从SomeClass导入__main__,但是你会遇到循环依赖的各种棘手问题。