簡體   English   中英

Python中方法定義的順序和類方法引用的字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM