22

如何从另一个函数内部的函数内部设置类变量?

变量.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

运行.py

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

蟒蛇运行.py

1
1
1

为什么a不等于4,我怎样才能使它等于4?

编辑:

谢谢大家-对不起,我现在才看到。我不小心被我的名字中的一个 _ 关闭了......所以我的范围实际上一切正常。

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——尤其是当我们可以显式地进行而不需要 getter 或 setter 时: 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

正如其他几个人所说,您需要在某个时候实际调用functiona 。评论不会让我清楚地输入这个,所以这里有一个答案:

def seta(self):
    def functiona(self):  #defined
        self.a = 4
    functiona()           #called
于 2013-01-16T21:43:43.890 回答
-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 回答