2009-11-26 13 views
113

なぜ、このような構造NameError:名 '自己' が

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

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

が定義されていませんが、エラーNameError: name 'self' is not definedを与えますか?

答えて

116

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

それはNoneに引数をデフォルトとコードでそのためのテストを追加するための一般的なパターンです:あなたもなしに「b」を設定するオプションを持っているしたい場合のために

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

私は上記があまりにもきれいではないと思うが(私は事がうまく動作するルビーから来ている)、実際は回避策として機能する。 Pythonがパラメータリストで自己を利用できなくすることを選択したのはまだおかしなことです。 – shevy

14

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

何があまりにも複雑であるか分かりません。 bのすべての値を保持する独自のソリューションで自由にチャイムしてください。 – Andrew

1

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

def foo(): 
    print(self.bar) 

> NameError:名前 '自己'

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

> "あなたはNameErrorを処分したおめでとう!" と定義されていません。

関連する問題