2012-07-25 42 views
1

我有一個關於在python中定義函數和自參數的問題。在python對象中使用自參數

有以下代碼。

class Dictionaries(object): 
    __CSVDescription = ["ID", "States", "FilterTime", "Reaction", "DTC", "ActiveDischarge"] 

    def __makeDict(Lst): 
     return dict(zip(Lst, range(len(Lst)))) 

    def getDict(self): 
     return self.__makeDict(self.__CSVDescription) 

    CSVDescription = __makeDict(__CSVDescription) 

x = Dictionaries() 
print x.CSVDescription 
print x.getDict() 

x.CSVDescription工作正常。但是print x.getDict()返回一個錯誤。

TypeError: __makeDict() takes exactly 1 argument (2 given) 

我可以self -parameter添加到__makeDict()方法,但隨後print x.CSVDescription是行不通的。

如何正確使用self-參數?

回答

3

使用@staticmethod一個解決方案將無法正常工作這裏是因爲從類本體調用方法本身並不會調用描述符協議(如果它們是描述符,這對於普通方法也是一個問題 - 但直到類定義編譯完成後纔會出現這種情況)。這裏有四個主要選項 - 但其中大多數可能被視爲某種程度的代碼混淆,並且真的需要評論才能回答「爲什麼不使用staticmethod?」這個問題。

第一個是,正如@Marcus所建議的,總是從類中調用方法,而不是從實例調用。也就是說,每次你會做self.__makeDict,請改爲self.__class__.__makeDict。這看起來很奇怪,因爲這是一件很奇怪的事情 - 在Python中,你幾乎不需要調用方法Class.method,而且你唯一的一次(在super之前編寫的代碼變得可用),使用self.__class__將是錯誤的。

以類似的方式,但相反,您可以使其成爲staticmethod並在類體中手動調用描述符協議 - 執行:__makeDict.__get__(None, Dictionaries)(__lst)

或者,你可以發現自己的被稱爲什麼情況下通過讓花哨可選參數:

def __makeDict(self, Lst=None): 
    if Lst is None: 
     Lst = self 
    ... 

但是,迄今爲止最好的辦法是:意識到你在Python的工作,而不是Java的 - 放在課外。

def _makeDict(Lst): 
    ... 

class Dictionaries(object): 
    def getDict(self): 
     return _makeDict(self.__CSVDescription) 

    CSVDescription = _makeDict(__CSVDescription) 
+0

是的,你是對的,我犯了錯誤,我刪除了我的答案。 – Marcus 2012-07-25 08:41:05

6

在python中,self參數被隱式傳遞給實例方法,除非該方法使用@staticmethod修飾。

在這種情況下,__makeDict不需要對象本身的引用,所以它可以製成一個靜態方法,因此可以省略self

@staticmethod 
def __makeDict(Lst): # ... 

def getDict(self): 
    return self.__makeDict(self.__CSVDescription) 
+0

但是當我添加@ staticmethod時,'CSVDescription = __makeDict(__ CSVDescription)'不起作用。然後我得到錯誤'TypeError:'staticmethod'對象不可調用'。 – wewa 2012-07-25 06:52:27

+0

@wewa您正在使用哪個Python版本? – 2012-07-25 07:14:30

+0

我正在使用Python版本2.5.1 – wewa 2012-07-25 08:50:14