2013-01-16 18 views
7

クラス変数を別の関数内の関数の内部から設定するにはどうすればよいですか?クラス内のネストされた関数内のPythonスコープ?

var.py

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     def afunction(): 
      self.a = 4 
     afunction() 
    def geta(self): 
     return self.a 

run.py

cA = A() 
print cA.a 
cA.seta() 
print cA.a 
print cA.geta() 

のpython run.py

1 
1 
1 

なぜ等しくない4を行い、どのように私は4それを等しくすることができますか?

おかげ

申し訳ありませんが、呼ばれる関数としての私の元のコード - 忘れてしまいました。

編集:

みんなありがとう - 申し訳ありませんが、私はちょうど今、見ました。私は間違いなく私の名前の_の中に_入っていました....だから、私の範囲は実際には大丈夫です。 setaインサイド

+3

あなたはあなたのコードで '関数'()を呼び出していませんでした。 –

+6

コードを回答に変更しないでください。どんな質問が答えられたかを見るために改訂を見なければならないなら、それは役に立たない。 – TheHerk

答えて

6

問題は複数の変数があることです。あなたの内部関数に渡された引数は、外側のスコープを上書きします。

内部関数からselfパラメータを削除し、その関数を何らかの方法で呼び出すことで、これを克服することができます。他のいくつかのよう

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     def afunction(): # no self here 
      self.a = 4 
     afunction()  # have to call the function 
    def geta(self): 
     return self.a 
1

、あなたはそれが今までと呼ばれるかどう 4にself.aを設定するだろうと...機能に

def afunction(self): 
     self.a = 4 

を定義します。しかし、それはどこでも呼び出されていないので、aは変更されていません。

2

他の人が触れたように、afunctionは決して呼び出されません。私たちはを必要とせずに、明示的にそれを行うことができます場合は特に - 私たちは実際にafunctionを呼び出して、明示的にselfそれを渡すが、これは属性aを設定するには、むしろ愚かな方法です

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

    def seta(self): 
     def afunction(self): 
      self.a = 4 
     afunction(self) 

    def geta(self): 
     return self.a 

a = A() 
print a.a 
a.seta() 
print a.a 

ここ:あなたはこのような何かを行うことができますゲッターやセッター:a.a = 4

それとも、機能returnできます

def seta(self): 
    def afunction(): #Don't need to pass `self`. It gets picked up from the closure 
     self.a = 4 
    return afunction 

し、コード内:

a = A() 
a.seta()() #the first call returns the `afunction`, the second actually calls it. 
-1

言っている、あなたはいくつかの点で実際にコール関数Aにする必要があります。コメントは、私はので、ここでの答えだintelligablyこれを入力させません。

def seta(self): 
    def functiona(self): #defined 
     self.a = 4 
    functiona()   #called 
+0

これは動作しません。少なくともPython 3では、 '1つの必須の位置引数が欠落しています: 'self''というエラーが発生します。 'functiona(self)'を呼び出す必要がありますが、この解決策はネストされた関数を定義するのに冗長です。 – Yeo

+0

これは、元の質問のクラスの範囲でこれが何かを定義していたことに気付かなかった。 –

0

はどのようにあなたはそれが4に同一視することができます:

class A: 
    def __init__(self): 
     self.a = 1 
     self.b = 2 
     self.c = 3 
    def seta(self): 
     ##def afunction(self): (remove this) 
     self.a = 4 
    def geta(self): 
     return self.a 

トリッキーな部分:なぜ4と同等でされていないん...

現在、aは「関数」によってのみ4に設定されています。関数は決して実行されないので決して実行されません。setaにはクラス内のメンバー変数に似た "関数"がネストされていますが呼び出されません。

関連する問題