我有一个类和该类中的一些方法,我想在该类中使用字典引用它们。如果我在类方法之前定义字典,我会得到一个"未定义的错误"。但是,如果我把字典放在方法定义之后,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
定义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()并成功运行(尽管您可能需要它们来添加一些功能)。如果您以后想要更改输入函数的名称或添加一些功能,这将非常有用。
原因是Python是一种解释语言,当class语句为时,所有代码class
语句都被执行
您可以在类定义中添加一些print
语句来查看它的作用。
因此,如果fooFunDic
在类定义的早期,那么它是在方法simple还不存在的时候执行的。
当您将变量python-serach分配给1:-Local命名空间中的变量时,请在gloabal命名空间中进行serach。Python在编译时逐行编译代码,因此如果有任何未定义的变量出现NameError: name 'fooFun1' is not defined
,则第一行先编译。
在您的案例中,python会查找字典值,但在解析字典之前不会定义这些值。
python中的主要功能是逐行解析代码,因此可以使用任何必须分配的变量。