2016-07-20 27 views
0
# structure 
package/ 
    m1.py 
    m2.py 


# m1.py 
class A: 
    pass 


if __name__ == '__main__': 
    from m2 import B 

    print(issubclass(B, A)) 


# m2.py 
from m1 import A 


class B(A): 
    pass 

我現在不是爲什麼我得到錯誤,而我認爲這顯然是正確的,當我運行m1.py.我的python版本是python3.5.2。爲什麼在這種方式下使用issubclass時會出現False?

回答

1

歡迎來到模塊和命名空間的世界!

這裏是發生了什麼:

在模塊M2,您從模塊M1導入。因此,您創建一個類m2.A作爲類m1.A的參考。它恰好與​​3210具有相同的定義,但它們是不同的對象,因爲主模塊被命名爲__main__而不是m1。然後,在模塊__main__你創建一個類__main__.B作爲參考類m2.B

爲了更好地理解這裏發生了什麼,我已經加入了一些代碼,M1:

... 
print(issubclass(B, A)) 

import m1 
import m2 
print(A == m1.A, m1.A == m2.A) 
print(B == m2.B) 
print(issubclass(B, m2.A), issubclass(B, m1.A)) 

輸出是:

False 
False True 
True 
True True 

證明B確實是m1.A的一個子類,但不是__main.A

1

創建2類對象,來自同一個班級。即:類代碼執行兩次,從而產生2個對象。而那些不一樣。例如:見下文

# m2.py 
from m1 import A 

class B(A): 
    pass 

print(A) 

# m1.py 
class A: 
    pass 

if __name__ == '__main__': 
    from m2 import B 
    print(A) 
    print(issubclass(B, A)) 

# Output 
#<class 'm1.A'> 
#<class '__main__.A'> 
#False 

print語句的輸出另外:看到this answer獲得更多信息。

相關問題