[英]Order of method definitions and dictionary of class method references in 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
}
定義字典時,尚未定義名稱。
類主體像函數一樣執行,並且本地名稱空間形成屬性。 名稱定義的相同順序適用於此。
請注意,即使在第二個示例中,存儲在字典中的也是函數 ,而不是方法。 如果要使這些函數像方法一樣工作,則調用這些函數將要求您顯式傳遞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
您是否需要將該dict作為靜態變量?
您可以這樣做:
class foo:
def __init__(self):
self.fooFunDic = {
'fooFun1': self.fooFun1,
'fooFun2': self.fooFun2
}
def fooFun1:
return 0
def fooFun2:
return 0
當您分配變量python在1:-本地名稱空間中搜索該變量,然后在全球名稱空間中搜索。 Python在編譯時逐行編譯了代碼,因此,如果有任何未定義的變量NameError: name 'fooFun1' is not defined
,則第一行首先編譯NameError: name 'fooFun1' is not defined
。
在您的情況下,python會執行什么操作,它將查找字典值,但是直到解析字典后才定義它們。
python中的主要內容是它逐行解析代碼,因此可以使用必須為其分配的任何變量來進行編碼。
原因是Python是一種解釋性語言,並且所有的代碼class
語句都在class
語句執行時執行 。
您可以在類定義中添加一些print
語句,以查看其作用。
因此,如果fooFunDic
在類定義的早期,則在簡單方法還不存在的時候執行它。
定義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()並成功運行(盡管您可能需要它們來添加一些功能)。 如果以后要更改輸入功能的名稱或要添加一些功能,這將很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.