2014-11-06 70 views
0

我有一個類和一些方法,我想用類中的字典引用它。如果我在類方法之前定義字典,我會得到一個「未定義的錯誤」。但是,如果我把方法定義後的字典python不抱怨。這是爲什麼?我能做些什麼來解決它?Python中的方法定義和類方法引用的字典順序

代碼示例:

這不起作用

class foo: 
    fooFunDic = { 
     'fooFun1': fooFun1, 
     'fooFun2': fooFun2 
    } 
    def fooFun1(self): 
     return 0 
    def fooFun2(self): 
     return 0 

醜,但工程

class foo: 
    def fooFun1(self): 
     return 0 
    def fooFun2(self): 
     return 0 
    fooFunDic = { 
     'fooFun1': fooFun1, 
     'fooFun2': fooFun2 
    } 

回答

2

的名稱是在定義詞典但都被定義。

類的主體像函數一樣執行,而局部名稱空間形成屬性。爲此應用相同的名稱定義順序。

請注意,即使在第二個示例中,您在字典中存儲的內容是函數,而不是方法。調用這些函數將要求您明確傳入參數self,如果您希望它們像方法一樣工作。您可以定義在__init__法字典,而不是讓在字典中綁定的方法存儲上的實例:

class foo: 
    def __init__(self): 
     self.fooFunDic = { 
      'fooFun1': self.fooFun1, 
      'fooFun2': self.fooFun2 
     } 

    def fooFun1(self): 
     return 0 
    def fooFun2(self): 
     return 0 

如果你不關心綁定方法與裸函數對象,你可以定義詞典第一,然後用該字典「註冊」每個功能:

class foo: 
    fooFunDic = {} 

    def fooFun1(self): 
     return 0 
    fooFunDic['fooFun1'] = fooFun1 

    def fooFun2(self): 
     return 0 
    fooFunDic['fooFun2'] = fooFun2 
0

您是否需要該詞典是一個靜態變量?

你可以這樣做:

class foo: 
def __init__(self): 
    self.fooFunDic = { 
     'fooFun1': self.fooFun1, 
     'fooFun2': self.fooFun2 
     } 
def fooFun1: 
    return 0 
def fooFun2: 
    return 0 
0

當你分配一個變量蟒蛇檢索算法該變量在1: - 本地命名空間,然後在檢索算法命名空間gloabal。 Python在編譯時逐行編譯代碼,因此首先編譯第一行,如果有任何未定義的變量出現NameError: name 'fooFun1' is not defined

在你的情況下,python會做什麼,它會查找字典值,但它們沒有被定義,直到解析dict。

在python中的主要事情是它逐行解析代碼,因此使用任何變量必須分配它。

0

的原因是,Python是一種解釋性的語言,所有的代碼class語句執行當類語句。

您可以在類定義中添加一些print語句以查看它的行爲。

因此,如果fooFunDic在類定義的早期階段,它的執行時間簡單的方法還不存在。

0

Define init並在其中傳遞fooFun1()和fooFun2()。

class foo: 
    def __init__ (self, fooFun1, fooFun2): 
     fooFunDic = { 
      'fooFun1': fooFun1, 
      'fooFun2': fooFun2 
     } 
    def fooFun1(): 
     return 0 
    def fooFun2(): 
     return 0 

這樣你就可以在不定義它們的情況下運行這些函數。這是一個很好的方法。通過這樣做,Python不會依賴於這些fooFun1()和fooFun2()併成功運行(儘管您可能需要它們來添加一些功能)。如果您稍後想要更改輸入函數的名稱或想要添加某些功能,這將很有用。