2012-10-31 50 views
1

我試圖獲得python 2.6的掛起,這是我對編程語言的介紹。我正在學習Python的艱難之路,我一定錯過了一些東西。我有一套我想要合併到一個類中的函數。這些功能包含在here。我試圖把它們組合成一個叫「解析器」的類。此代碼包含here將函數轉換爲python中的類的方法

這些函數本身在課堂外工作。我想調用的函數出類這樣的:

導入模塊:

>>> from ex48 import parser2 

分配類:

>>> parser_class = parser2.Parsers() 

調用一個函數:

>>> parser_class.parse_subject(word_list, ('noun', 'player')) 

我收到以下內容:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "ex48/parser2.py", line 60, in parse_subject 
    verb = parse_verb(word_list) 
NameError: global name 'parse_verb' is not defined 

不知道爲什麼它告訴我。有人能指引我朝着正確的方向嗎?

+1

術語問題:「方法」根據定義是「類的可調用成員」。您的問題不涉及「將方法轉換爲類」,它將函數放在類中或將函數轉換爲方法(正如您在問題的正文中所述)。 –

回答

3

你對你的代碼在做什麼感到困惑。

這不分配,一類,它創建一個實例,該實例分配給一個變量:

parser_class = parser2.Parsers() 

這就需要對實例的方法:

parser_class.parse_subject(word_list, ('noun', 'player')) 

下面告訴你沒有全局函數(或任何類型的變量)parse_verb

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "ex48/parser2.py", line 60, in parse_subject 
    verb = parse_verb(word_list) 
NameError: global name 'parse_verb' is not defined 

我希望您想將其更改爲verb = self.parse_verb(word_list),這將調用同一對象的parse_verb方法(self)。

+0

這似乎是正確的答案,但他需要將他的方法調用的所有更改調用爲顯式調用「self」,而不僅僅是此調用。 (例如,下一行調用'parse_object',但我認爲這足以解釋爲什麼他需要將'self.'添加到'parse_verb',在這種情況下,他會解決這個問題。 – abarnert

+0

@abarnert I不能評論我看不到的代碼 – Marcin

+0

爲什麼你不能看到它?他提供了一個代碼鏈接,你修正的行是第24行。 – abarnert

1

看起來您正在從python交互式會話中工作。

如果你已經導入parser2後作出parser2.py任何改變,那麼你必須

reload(parser2) 

,使已知的交互式解釋這些變化。

2

這裏有兩個問題,一個機械,一個概念。我會先處理後者。

一個類的重點在於它的實例代表了你的世界模型中的某種對象。例如,「句子」是一個對象,所以有一個名爲Sentence的類是有意義的,但「解析器」不是對象,因此Parsers可能會成爲一個混淆的類。不太抽象地看待事物,一個類通常具有某種狀態,封裝在其方法工作的數據成員中。

你真正在這裏得到的是一個解析器函數,它返回一個Sentence對象(或者產生一個ParserError)。該功能可以是Sentence的一種方法,或者它可以是一個自由功能;如果在你的模型中存在這樣一個對象的任何原因,但它也可能是類的一種方法,但似乎並不存在。

如果你只是想封裝所有這些幫助函數,這樣他們就不會亂扔全局命名空間(本身就是個好主意),你不需要濫用類來做到這一點。只需在parse_sentence內部使用它們的本地功能,或將它們放在名爲parsers的模塊中即可。

現在,解決機械問題:如果您在班級中有方法,通常只能通過點語法調用它:someObject.methodName(params)。當方法調用同一對象的另一個方法時,可以使用特殊的self參數(您已正確列出每個方法的第一個參數)來完成該操作。所以:

verb = self.parse_verb(word_list) 
obj = self.parse_object(word_list) 

...等等,在您的示例中的所有其他方法調用。

並非每種語言都需要這樣的顯式self。例如,在C++或相關語言(Java,C#等)中,一種方法可以在不指定目標的情況下調用另一種方法,並且隱含地假定目標是this(C++等效於self)。

+0

這是非常豐富的,而且我同意你的說法概念同意。我只是按照教程,我認爲該教程的目的之一就是讓我意識到類不是針對像這樣的用例。感謝您花時間解釋這一點。 – numb3rs1x