2012-03-13 152 views
1

我得到了以下python代碼,其中printSaved被點擊按鈕(使用wx庫和python 2.7.2)時被調用。但是,當發生這種情況我有一個非常奇怪的錯誤奇怪的額外參數

Traceback (most recent call last): 
    File "./program.py", line 135, in printSaved 
    s = self.readSaved() 
TypeError: readSaved() takes no arguments (1 given) 

下面是代碼

def readSaved(): 
    f = codecs.open((os.getenv('HOME') +'/Dokument/savefile.txt') ,'r','utf-8') 
    l = f.readlines() 
    f.close() 
    return l 

    def printSaved(self,event): 
    s = self.readSaved() 
    for l in s: 
     print l 

我加入一個參數readSaved(somethingUseless)固定的問題和一切工作正常。我的問題是傳遞給readSaved和HOW/WHY的是什麼?這與事件有關嗎?

回答

3

在Python,在其上的方法被調用的對象總是以顯式地傳遞作爲參數。這個論點通常被稱爲self

readSaved()作爲實例方法的正確定義應該有這個作爲第一行:

def readSaved(self): 
    # ... 

如果你希望它是一個模塊級的功能,你應該叫它如下:

s = readSaved() 
+0

感謝您的回答,這有助於我瞭解更多關於python的信息 – nist 2012-03-13 13:51:53

0

因爲它是一種方法 - 無論如何你都把它稱爲一種方法 - 你必須至少有self作爲參數。當一個函數被調用爲方法時,您調用該方法的對象將作爲第一個參數傳遞給該函數。

1

它是在一個類中定義的嗎?我想它是的,因爲第二種方法需要self

如果readSaved是一個實例方法,它也需要self作爲第一個參數。如果您不需要它,請使用@staticmethod修飾符代替:

@staticmethod 
def readSaved(): 
    f = codecs.open((os.getenv('HOME') +'/Dokument/savefile.txt') ,'r','utf-8') 
    l = f.readlines() 
    f.close() 
    return l