NameError: имя 'self' не определено - PullRequest
129 голосов
/ 26 ноября 2009

Почему такая структура

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

выдает ошибку NameError: name 'self' is not defined?

Ответы [ 3 ]

135 голосов
/ 26 ноября 2009

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

Это обычный шаблон для задания аргумента по умолчанию None и добавления теста для этого в коде:

def p(self, b=None):
    if b is None:
        b = self.a
    print b
16 голосов
/ 26 ноября 2009

Для случаев, когда вы также хотите установить «b» в «Нет»:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b
6 голосов
/ 05 августа 2017

Если вы пришли сюда через Google, убедитесь, что вы указали self в качестве первого параметра функции класса. Особенно, если вы пытаетесь ссылаться на значения для этого объекта внутри функции.

def foo():
    print(self.bar)

> NameError: имя 'self' не определено

def foo(self):
    print(self.bar)

> «Поздравляю, вы избавились от ошибки NameE!»

...