2014-01-17 66 views
-1

我正在研究一個項目,需要我在一個文件中創建幾個類和子類,並在第二個文件中使用它們。我想問一下Python如何處理將第一個文件導入到第二個文件中。Python如何處理導入的子類?

例如,如果我有一個文件my_classes.py:

class Myclass(object): 
    pass 

class Mysubclass(myclass): 
    pass 

將用下面的代碼工作:

from my_classes import Myclass 

print Mysubclass 

(其中print命令是隻使用Mysubclass的一例) ,還是我需要明確導入Mysubclass

在此先感謝!

+1

爲什麼不試試這段代碼,看看有沒有錯誤? – zhangxaochen

+0

似乎很明顯的解決方案,並且確實回答了我的問題。不過,我想了解一些背景信息,說明爲什麼Python的行爲方式如此(例如,爲什麼在導入類時不自動加載子類)。 – LSchoon

回答

0

這不起作用。 Python import語句不關心子類。其實,它並不關心任何事情。它正是你告訴它做的。 「明確比隱含更好」是Python界的流行說法。

這裏:

from my_classes import Myclass 

你告訴Python來只Myclass進口。

這將導入兩個類:

from my_classes import Myclass, Mysubclass 

您可以瞭解如何的Python import工作here

+0

謝謝!你提供的鏈接超出了我的理解範圍,但回答了我的問題。 – LSchoon

0

如果你這樣做,你的子類將不可用。您必須自行導入每個對象。

這裏一個簡單的例子

test_class.py MyClass類(對象): DEF 初始化(個體): 打印自我。

test_class_import.py 從進口爲test_class MyClass的

MyClass() 
MySubClass() 

##output## 
<class 'test_class.MyClass'> 
Traceback (most recent call last): 
    File "test_class2.py", line 4, in <module> 
    MySubClass() 
NameError: name 'MySubClass' is not defined 

from test_class import MyClass, MySubClass 
MyClass() 
MySubClass() 

##output## 
<class 'test_class.MyClass'> 
<class 'test_class.MySubClass'> 
0

每個模塊都有一個命名空間。

命名空間是從變量名到值(Python對象)的映射。

聲明

import my_classes 

使得在當前模塊的名稱空間放置變量名my_classesmy_classes命名空間從當前模塊訪問。然後,您可以從my_classes的語法訪問值

my_classes.variable 

因此,舉例來說:

import my_classes 
print my_classes.Mysubclass 
print my_classes.MyClass 

如果是太多了打字,我建議

import my_classes as MC 
print MC.Mysubclass 
print MC.MyClass 

你也可以做

from my_classes import Mysubclass, MyClass 

但這種進口形式是discouraged by some Python experts

from my_classes import Mysubclass, MyClass 

加載整個模塊my_class,但只有 地方變量名稱在當前模塊的名稱空間MysubclassMyClass。它們指向與my_classes名稱空間中同名變量相同的值。您無法訪問my_class模塊名稱空間中的任何其他內容。