2012-08-16 274 views
-1

也許愚蠢的問題調用類的,我讀過很多關於這裏的類似線程,但仍無法捉摸了答案:從導入模塊

在main.py

from userMod import * 

class Handler(webapp2.RequestHandler): 
    def write(self): #some code here etc 

在userMod.py

class signup(Handler): 
    def get(self): #some code here etc 

我收到一個錯誤,說Handler沒有定義。我簡單但明顯愚蠢的問題是,如何從加載模塊中的父腳本訪問類?還是僅僅需要在我創建的每個模塊中複製Handler?

請記住,我對Python很陌生,試圖通過拆分某些類型的函數(在本例中爲我正在構建的站點的用戶登錄和註冊組件)來使代碼更加模塊化。

+1

這不是導入工作的方式。 http://docs.python.org/tutorial/modules.html – 2012-08-16 07:28:27

+0

感謝RocketDonkey和Sebastian Kreft的解決方案: – 2012-08-16 07:51:07

回答

1

在usermod.py中,您需要導入main,而不是反過來。

+0

請原諒我的完全無知......我有一個main.py,其中包含我的大部分代碼和從app.yaml作爲該站點的着陸點調用。我想將所有的用戶函數(登錄,註冊等)移動到一個單獨的模塊中,以節省main.py中的代碼量...所以我將它們移動到userMod.py並將其導入到main。我沒有看到或瞭解如何將main導入到userMod,除非我只是將導入主要添加到userMod的頂部,但是然後我將它們同時導入到兩個中。當然,我錯了?有沒有更好的方法來構建腳本架構? – 2012-08-16 07:41:54

+1

在你的情況下,只需將Handler類移動到userMod。如果Handler類也用於其他一些模塊,則需要另一個模塊,並將其稱爲common.py或utils.py,並將其導入所有需要Handler類的模塊中。 – 2012-08-16 07:48:37

+0

謝謝...這是一個更好的解決方案。 Handler將被用作所有這些的基類,因此將它放入它自己並將其導入到所有內容中將是有意義的。 – 2012-08-16 07:50:16

1

不能確定沒有看到你的代碼,但在這個非常基本的代碼片段中,你基本上已經取消了導入。 @ IgnacioVazquez-Abrams提供了一個描述整個過程的鏈接(絕對比我能做的更好),但是在基本層面上,每個模塊都存在於它自己的命名空間中,除非你告訴它,否則不會意識到其他模塊他們。

因此,在你的情況下,當你子類Handler,該模塊不知道什麼Handler是因爲它是1.)不是內置的,2.)尚未導入。試試這個在usermod.py

import main 

class signup(main.Handler): 
    def get(self): #some code here etc 

並看看它是否做你想要的。

+0

啊好吧......在發佈之前,我已經閱讀了Ignacio鏈接的文章,但我仍然認爲導入的模塊可能能夠以某種方式訪問​​父母班,顯然不是。在我的情況下,main.py包含了大量的代碼,爲了訪問Handler類,將它導回到這個更小的模塊中似乎很奇怪。如果沒有其他的方法去做,那麼我會在每個需要它的模塊中複製Handler類。謝謝回覆。 – 2012-08-16 07:47:45

+0

你可以像'從主進口​​處理程序'那樣做一些東西來拉動這個類。或者只是將所有處理程序捆綁在一個地方。 – RocketDonkey 2012-08-16 08:11:23