Python中方法定义的顺序和类方法引用的字典

Python中方法定义的顺序和类方法引用的字典,python,class,dictionary,Python,Class,Dictionary,我有一个类和该类中的一些方法,我想在类中使用字典引用它们。如果我在类方法之前定义字典,我会得到一个“未定义错误”。但是,如果我把字典放在方法定义之后,python不会抱怨。为什么呢?我能做些什么来修复它 代码示例: 这行不通 class foo: fooFunDic = { 'fooFun1': fooFun1, 'fooFun2': fooFun2 } def fooFun1(self): return 0 def

我有一个类和该类中的一些方法,我想在类中使用字典引用它们。如果我在类方法之前定义字典,我会得到一个“未定义错误”。但是,如果我把字典放在方法定义之后,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
参数,如果希望它们像方法一样工作的话。您可以在
\uuuu init\uuuu
方法中定义字典,以获取实例上存储的字典中的绑定方法:

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

当您在1:-本地名称空间中分配一个变量python serach,然后在gloabal名称空间中分配该变量。Python在编译时逐行编译代码,因此,如果出现任何未定义的变量,请先编译第一行

在您的例子中,python会查找字典值,但在解析dict之前不会定义这些值


python的主要功能是逐行解析代码,因此开始使用必须分配的任何变量。

原因是python是一种解释语言,所有的代码
class
语句都是在class语句被调用时执行的

您可以在类定义中添加一些
print
语句来查看它的实际操作


因此,如果
fooFunDic
在类定义的早期,它会在简单方法还不存在的时候执行。

定义init并在其中传递fooFun1()和fooFun2()

这样,您就可以运行这些函数,而无需事先定义它们。这是一个很好的方法。通过这样做,Python将不会依赖于这些fooFun1()和fooFun2(),并成功运行(尽管您可能需要它们来添加一些功能)。如果以后要更改输入函数的名称或要添加某些功能,这将非常有用

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