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


144

なぜそのような構造

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

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

エラーを出しますNameError: name 'self' is not definedか?

回答:


159

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

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

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

4
上記は非常にきれいではないと思いますが(私は物事がうまく機能するルビーから来ています)、上記は実際に回避策として機能します。pythonがパラメータリストでselfを使用不可にすることを選択したのは、依然として厄介です。
18年

2
@shevy:「自己」はPythonでは特別な意味はありません。これは、従来の方法で最初の引数として選択された名前にすぎません。「自分」を「私」または「x」で置き換えることもできます。
最大

これを行うためのより良い方法はありませんか?自分自身を参照する必要があるデフォルトの引数を10個取る関数がある場合、本当に12個のifステートメントが必要ですか?これはひどく厄介です。
Richard J. Barbalace

16

「b」を「なし」に設定するオプションも必要な場合:

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

6

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

def foo():
    print(self.bar)

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

def foo(self):
    print(self.bar)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.