【问题标题】:Getting NameError when calling function in constructor在构造函数中调用函数时出现 NameError
【发布时间】:2011-08-08 21:21:52
【问题描述】:

我通过调用构造函数中的函数来运行下面的代码

首先--

>>> class PrintName:
...    def __init__(self, value):
...      self._value = value
...      printName(self._value)
...    def printName(self, value):
...      for c in value:
...        print c
...
>>> o = PrintName('Chaitanya')
C
h
a
i
t
a
n
y
a

我再次运行它,我得到了这个

>>> class PrintName:
...    def __init__(self, value):
...      self._value = value
...      printName(self._value)
...    def printName(self, value):
...      for c in value:
...        print c
...
>>> o = PrintName('Hello')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in __init__
NameError: global name 'printName' is not defined

我不能在构造函数中调用函数吗?以及为什么类似代码的执行会出现偏差?

注意:我忘记使用 self 调用类的本地函数(例如:self.printName())。为帖子道歉。

【问题讨论】:

    标签: python constructor


    【解决方案1】:

    您需要调用self.printName,因为您的函数是属于 PrintName 类的方法。

    或者,由于您的 printname 函数不需要依赖对象状态,您可以将其设为模块级函数。

    class PrintName:
        def __init__(self, value):
            self._value = value
            printName(self._value)
    
    def printName(value):
        for c in value:
        print c
    

    【讨论】:

      【解决方案2】:

      代替

      printName(self._value)
      

      你想要的

      self.printName(self._value)
      

      这可能是第一次工作,因为您在父作用域中有另一个函数 printName

      【讨论】:

        【解决方案3】:

        你想要的是self.printName(self._value) in __init__,而不仅仅是printName(self._value)

        【讨论】:

          【解决方案4】:

          我知道这是一个老问题,但我只是想补充一点,您也可以使用类名调用函数并将 self 作为第一个参数传递。

          不知道您为什么要这样做,因为我认为这可能会使事情变得不太清楚。

          class PrintName:
              def __init__(self, value):
                  self._value = value
                  PrintName.printName(self, self._value)
          
              def printName(self, value):
                  for c in value:
                  print(c)
          

          有关更多信息,请参阅 Python 手册的第 9 章:

          9.3.4. Method Objects

          其实你可能已经猜到答案了:方法的特别之处在于对象作为函数的第一个参数传递。在我们的示例中,调用 x.f() 完全等同于 MyClass.f(x)。一般来说,调用具有 n 个参数列表的方法等效于调用具有参数列表的相应函数,该参数列表是通过在第一个参数之前插入方法的对象而创建的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-07-15
            • 1970-01-01
            • 1970-01-01
            • 2013-10-03
            • 2021-11-23
            相关资源
            最近更新 更多