在构造函数中调用函数时获取NameError

时间:2011-08-08 21:21:52

标签: python constructor

我通过调用构造函数

中的函数来运行下面的代码

首先 -

>>> 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(ex:self.printName())调用类的本地函数。为这篇文章道歉。

4 个答案:

答案 0 :(得分:11)

您需要调用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

答案 1 :(得分:1)

而不是

printName(self._value)

你想要

self.printName(self._value)

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

答案 2 :(得分:1)

您想要的是self.printName(self._value)中的__init__,而不只是printName(self._value)

答案 3 :(得分:1)

我知道这是一个老问题,但我只是想补充一点,你也可以使用类名调用函数并将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个参数列表调用方法等效于使用通过在第一个参数之前插入方法对象而创建的参数列表来调用相应的函数。