Получение NameError при вызове функции в конструкторе - PullRequest
3 голосов
/ 09 августа 2011

Я запустил код ниже, вызвав функцию в конструкторе

Первый -

>>> 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 ()). Извиняюсь за пост.

Ответы [ 4 ]

11 голосов
/ 09 августа 2011

Вам необходимо вызвать 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 голос
/ 27 апреля 2013

Я знаю, что это старый вопрос, но я просто хотел добавить, что вы также можете вызывать функцию, используя имя класса и передавая себя в качестве первого аргумента.

Не уверен, почему вы хотитехотя, как мне кажется, это может сделать вещи менее понятными.

class PrintName:
    def __init__(self, value):
        self._value = value
        PrintName.printName(self, self._value)

    def printName(self, value):
        for c in value:
        print(c)

См. главу 9 руководств по python для получения дополнительной информации:

9.3.4.Объекты метода

На самом деле, вы, возможно, догадались, что ответ: особенность метода заключается в том, что объект передается в качестве первого аргумента функции.В нашем примере вызов xf () в точности эквивалентен MyClass.f (x).В общем, вызов метода со списком из n аргументов эквивалентен вызову соответствующей функции со списком аргументов, который создается путем вставки объекта метода перед первым аргументом.

1 голос
/ 09 августа 2011

То, что вы хотите, это self.printName(self._value) в __init__, а не просто printName(self._value).

1 голос
/ 09 августа 2011

вместо

printName(self._value)

Вы хотели

self.printName(self._value)

Вероятно, это сработало в первый раз, потому что у вас была другая функция printName в родительской области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...