2017-02-26 10 views
1

私はこれを検索しましたが、何も見つかりませんでした。 Python documentation 9.2.1には、関数scope_test()を使用して与えられた例があります。Python 3.6.0のクラス内のメソッドには非ローカルです

def scope_test(): 
    def do_local(): 
     spam = "local spam" 

    def do_nonlocal(): 
     nonlocal spam 
     spam = "nonlocal spam" 

    def do_global(): 
     global spam 
     spam = "global spam" 

    spam = "test spam" 
    do_local() 
    print("After local assignment:", spam) 
    do_nonlocal() 
    print("After nonlocal assignment:", spam) 
    do_global() 
    print("After global assignment:", spam) 

scope_test() 
print("In global scope:", spam) 

私はclassに変更し、それを実行し、私が取得:

SyntaxError: no binding for nonlocal 'spam' found 

私は'nonlocal'は、クラス内のメソッドのために動作しませんが、それだけで関数内の関数を見つける働く把握。私がオンラインで見つけた答えはすべて、クラスではなく関数用です。

  • なぜ非ローカルはクラスに対して機能しませんか?
  • 道はありますか?

答えて

1

nonlocalは確かにクラス内のメソッドのために働く、あなただけの巣に方法で機能を必要とする(私はここstaticmethodを使用しています):

クラスは導入しない scope_testを作る
class Foo: 
    @staticmethod 
    def scope_test(): 
     def do_local(): 
      spam = "local spam" 

     def do_nonlocal(): 
      nonlocal spam 
      spam = "nonlocal spam" 

     def do_global(): 
      global spam 
      spam = "global spam" 

     spam = "test spam" 
     do_local() 
     print("After local assignment:", spam) 
     do_nonlocal() 
     print("After nonlocal assignment:", spam) 
     do_global() 
     print("After global assignment:", spam) 

Foo.scope_test() 
print("In global scope:", spam) 

nonlocalが動作するのに必要な入れ子。あなたはまだ入れ子が必要です。

1

この例で表示される字句スコープは、関数の名前空間に対してのみ機能します。これがクラスで動作するとしたら、すべてのクラスメソッドは、実際に動作するように、selfのパラメータやクラス名ではなく、クラス属性に直接アクセスできます。すなわち

、クラスの名前空間は、クラス内のメソッドのための包囲範囲を導入しない、これはまた、クラス本体レベルのバインディングを見つけることからnonlocalを防止します。

関連する問題