Python作用域在类内的嵌套函数中?

2024-04-26 05:48:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

变量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()

python运行.py

1
1
1

为什么a不等于4,我怎么能让它等于4?

编辑:

谢谢大家-对不起,我刚才看到了。我不小心被一个叫阿乌的人打昏了。。。。所以我的范围其实都还可以。


Tags: 函数pyself编辑returninitdefclass
3条回答

seta内部,定义一个函数

    def afunction(self):
        self.a = 4

…如果调用它,将把self.a设置为4。但它不在任何地方调用,因此a保持不变。

正如其他人所提到的,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.

问题是存在多个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

相关问题 更多 >