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

时间:2014-11-06 10:50:25

标签: python class dictionary

我在该类中有一个类和一些方法,我想使用类中的字典来引用它。如果我在类方法之前定义字典,我得到一个"未定义的错误"。但是,如果我把字典放在方法定义之后,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
    }

5 个答案:

答案 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()并成功运行(尽管您可能需要它们来添加一些功能)。如果您以后想要更改输入函数的名称或者想要添加某些功能,这将非常有用。