web-dev-qa-db-ja.com

NameError:名前 'self'は定義されていません

なぜそのような構造

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

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

エラーNameError: name 'self' is not defined

131
chriss

デフォルトの引数値は関数定義時に評価されますが、selfは関数呼び出し時にのみ利用可能な引数です。したがって、引数リスト内の引数は相互に参照できません。

引数をNoneにデフォルト設定し、そのためのテストをコードに追加するのは一般的なパターンです。

def p(self, b=None):
    if b is None:
        b = self.a
    print b
139
intgr

'b'をNoneに設定するオプションも必要な場合:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b
16
Andrew

Google経由でここに到着した場合は、クラス関数の最初のパラメーターとしてselfを指定したことを確認してください。特に、関数内でそのオブジェクトの値を参照しようとする場合。

def foo():
    print(self.bar)

> NameError:名前 'self'は定義されていません

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

>「おめでとうございます、NameErrorを取り除きました!」

6
Erich