2016-06-14 80 views
1

基本上我有一個項目設置像這樣:解釋認爲,同一類的兩個聲明都是不同

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

我得到預期的成功。

回答

0

他們不是同一班。這是由於一個怪癖,當你運行一個python模塊(即python main.py)時,它運行爲__main__。因此,您有__main__.SomeClass(來自程序的根模塊)和main.SomeClass(來自source導入的模塊),它們是不同模塊的不同類。

要解決您的問題,最好將該課程移到另一個模塊,並從此第三個模塊中同時導入mainsourceSomeClass

從技術上講,你也可以從__main__導入SomeClass,但是你會遇到各種循環依賴的棘手問題。

相關問題