我在该类中有一个类和一些方法,我想使用类中的字典来引用它。如果我在类方法之前定义字典,我得到一个"未定义的错误"。但是,如果我把字典放在方法定义之后,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
}
答案 0 :(得分:2)
定义字典时,还要定义名称。
类主体像函数一样执行,本地命名空间形成属性。同样的名称定义顺序也适用于此。
请注意,即使在第二个示例中,您在词典中存储的内容是 functions ,而不是方法。调用这些函数将要求您明确传入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
答案 1 :(得分:0)
你需要那个dict是一个静态变量吗?
你可以这样做:
class foo:
def __init__(self):
self.fooFunDic = {
'fooFun1': self.fooFun1,
'fooFun2': self.fooFun2
}
def fooFun1:
return 0
def fooFun2:
return 0
答案 2 :(得分:0)
当您在1:-Local namespace中为变量分配变量python serach时,然后在gloabal名称空间中搜索。 Python在编译时逐行编译代码,因此如果有任何未定义的变量来NameError: name 'fooFun1' is not defined
,则首先编译第一行。
在你的情况下python做什么,它查找字典值,但它们没有被定义,直到解析dict。
python中的主要功能是逐行解析代码,因此使用您必须分配的任何变量。
答案 3 :(得分:0)
原因是Python是一种解释型语言,当语句为。时,所有代码class
语句都是执行。
您可以在类定义中添加一些print
语句,以查看它的实际效果。
因此,如果fooFunDic
在类定义的早期,它就是在方法简单不存在的时候执行的。
答案 4 :(得分: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()并成功运行(尽管您可能需要它们来添加一些功能)。如果您以后想要更改输入函数的名称或者想要添加某些功能,这将非常有用。