22

別の関数内の関数内からクラス変数を設定するにはどうすればよいですか?

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

a が 4 に等しくないのはなぜですか?どうすれば 4 に等しくなりますか?

編集:

みんなありがとう - すみません、今見ました。私は誤って自分の名前の 1 つで _ がずれていました.... したがって、私のスコープは実際にはすべて問題ありません。

4

5 に答える 5

21

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

これを克服するに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
于 2013-01-16T21:43:38.040 に答える
4

他の人が述べたように、afunction決して呼び出されません。次のようなことができます。

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

ここでは実際に を呼び出しafunctionて明示的に渡しますselfが、これは属性を設定するかなりばかげた方法です。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.
于 2013-01-16T21:41:39.717 に答える
1

内部setaで、関数を定義します

    def afunction(self):
        self.a = 4

...これが呼び出されると、4設定されます。self.aしかし、どこにも呼び出されていないため、変更されてaいません。

于 2013-01-16T21:38:42.437 に答える
-1

どうすればそれを 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 は「afunction」を介してのみ 4 に設定されています。関数は決して呼び出されないため、実行されることはありません.setaには「関数」がネストされていますが、呼び出されていません...クラス内のメンバー変数に似ています。

于 2013-01-16T21:47:09.783 に答える
-1

他の何人かが言ったように、ある時点で実際に functiona を呼び出す必要があります。コメントではこれを分かりやすく入力できないので、ここに答えがあります:

def seta(self):
    def functiona(self):  #defined
        self.a = 4
    functiona()           #called
于 2013-01-16T21:43:43.890 に答える