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