解释认为,同一类的两个声明都是不同

解释认为,同一类的两个声明都是不同

问题描述:

基本上我有一个项目设置像这样:解释认为,同一类的两个声明都是不同

<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): 

我得到预期的成功。

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

要解决您的问题,最好将该课程移到另一个模块,并从此第三个模块中同时导入mainsourceSomeClass

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