2012-07-05 70 views
0
class Parser(): 
     html_escape_table = { 
      "&": "&", 
      '"': """, 
      "'": "'", 
      ">": ">", 
      "<": "&lt;", 
      } 
     def html_escape(text): 
      return "".join(html_escape_table.get(c,c) for c in text) 
     def query(): 
      database = [x, y, z, etc, etc2] 
      for x in database: 
       html_escape(x) 
       print x #for testing purposes 
       return 
test = Parser() 

test.query() 

上午我做正確嗎?我不斷收到一個錯誤:第一次使用類 - 我做錯了什麼?

TypeError: query() takes no arguments (1 given) 

我沒有看到任何地方,我傳遞參數查詢,甚至解析器。

有人能解釋什麼,我做錯了什麼?

我打過電話只是Parser.query(),並得到這個錯誤(這是將自我論證我所有的功能和對象的參數傳遞給我的分析器類後),類

Parser.query() 
TypeError: unbound method query() must be called with Parser instance as first argument (got nothing instead) 
+1

一個類總是傳遞一個對自身的引用作爲第一個參數。改變'query()'的定義爲'def query(self):' –

+0

你應該閱讀Python教程,它解釋了所有這些。 – BrenBarn

+1

等待,如果'query'沒有在Parser對象中使用任何東西,那麼爲什麼你把它寫成'Parser'的方法呢?爲什麼不把它作爲函數保存在類之外的同一個文件中? – inspectorG4dget

回答

7

方法需要參數self這是爲了將實例解析爲python如何實現方法的方法。

例如

class Test(object): 
    def say_hello(self): 
     print "Hi there" 

只是爲了這個擴展,如果你想分析參數,你仍然需要一個實例方法self

class Test(object): 
    def say_hello(self, name): 
     print "Hi %s" % name 

編輯:

好進一步解釋它,你必須知道如何蟒蛇處理的情況下,蟒蛇處理的非常詳細和明確的方式的情況下,self總是被用來指代自己或這個當前實例,就像在Java中this。所以,當蟒蛇調用my_instance.method()其實際調用TheObject.method(my_instance)因此爲什麼自我是指方法內的my_instance。這允許您在方法內部使用實例本身傳遞給arugments的實例。

編輯2:

即使你有自我作爲參數傳遞給你需要從一個實例調用它的方法,因此

my_parser = Parser() 
my_parser.method() 

編輯3:

這不是Java中,你不必你的功能結合在一起作爲一個類內部的方法,只是讓他們爲自由漫遊parser.py文件中的功能,那麼你可以做

import parser 
parser.do_this() 
+1

你能否進一步解釋這個概念?我不完全明白這一點。基本上,我調用方法的一個實例,我必須使用self來引用方法的實例,而不是實際的方法? –

+0

@AndrewAlexander試圖更好地解釋它 –

4

使用Python,類方法必須有他們的第一個參數是self

class Parser(): # Creates a class that contain all of the functions that parse the mood based on tweets 
    html_escape_table = { 
            "&": "&amp;", 
            '"': "&quot;", 
            "'": "&apos;", 
            ">": "&gt;", 
            "<": "&lt;", 
    } 
    def html_escape(self, text): 
     return "".join(html_escape_table.get(c,c) for c in text) 
    def query(self): 
     database = [x, y, z, etc, etc2] 
        for x in database: 
         html_escape(x) 
            print x #for testing purposes 
            return 

test = Parser() 

test.query() 
+2

您的帖子已損壞。 –

+0

真的嗎?我正在修復它... – C0deH4cker

+1

不要忘記編輯所有方法的參數。 –

1

啊!

您對Parser類型的對象(稱爲test)致電query。在引擎蓋下,python正在做什麼,正在調用Parser.query(test)

這就是爲什麼當你寫一個類中的方法,你應該始終包括self作爲第一個參數。

正如其他人提及,改變你的函數簽名def query(self)將解決這個問題

希望幫助

+0

呵呵,我只想打電話給Parser.query() –

2

一個小的事情:如果你開始在Python(至少在Python 2.x中,使用Python類3不同),您可能想要使用從object繼承的新樣式類。

的Python 2.x的類,新的風格:

class MyClass(object): 
    def __init__(self, args): 
     # some code here 

    # more methods here 

舊的樣式類(不object)不應再在Python 2

如果你正在使用用於當前版本Python 3,它不同。類是在Python 3中進行了清理的概念之一,因此不再需要從object繼承。因此,如果您正在學習使用Python中的類,請確保您獲得的說明適用於正確的版本(主要是2 vs 3)。

+1

除非你在Python3那麼'object'是內在的 –

+0

@JakobBowyer我以爲我寫的那種......那種...... – kratenko

+0

那麼它不清楚足夠在您的文章 –

2

在任何面向對象的語言中,方法必須有一種方法來訪問它們被調用的對象。在某些語言中,這是隱式完成的。在Python中,方法必須首先用明確的參數self來聲明。

在這裏我修復了您的代碼,使其具有self參數。

class Parser(): 
    """A class that contain all of the functions that parse the mood based on tweets.""" 
    html_escape_table = { 
     "&": "&amp;", 
     '"': "&quot;", 
     "'": "&apos;", 
     ">": "&gt;", 
     "<": "&lt;", 
     } 
    def html_escape(self, text): 
     return "".join(self.html_escape_table.get(c,c) for c in text) 

    def query(self): 
     database = [x, y, z, etc, etc2] 
     for x in database: 
      self.html_escape(x) 
      print x #for testing purposes 
      return 

test = Parser()  
test.query() 

當你調用像test.query()的方法,該query方法被調用,並test傳遞在爲self參數。另外,在你的方法中,當你想引用對象時,你必須使用self參數來明確地訪問屬性。

最後一點:在你的query()方法中,你在for循環中返回,所以你只會執行循環的一次迭代,而不是迭代所有的database