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



我有一个类和该类中的一些方法,我想在该类中使用字典引用它们。如果我在类方法之前定义字典,我会得到一个"未定义的错误"。但是,如果我把字典放在方法定义之后,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中的主要功能是逐行解析代码,因此可以使用任何必须分配的变量。

最新更新