【问题标题】:Python scope inside a nested function inside a class?类内嵌套函数内的Python范围?
【发布时间】:2013-01-16 21:35:25
【问题描述】:

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

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

运行.py

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

python 运行.py

1
1
1

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

编辑:

谢谢大家 - 抱歉,我现在才看到。我不小心被我名字中的一个 _ 弄丢了……所以我的范围实际上一切正常。

【问题讨论】:

  • 你甚至没有在你的代码中调用afunction()。
  • 您不应将代码更改为答案。如果我们必须查看修订以查看回答了哪些问题,这将无济于事。

标签: python


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如其他人所提到的,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 时:@ 987654326@

    或者你可以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.
    

    【讨论】:

      【解决方案3】:

      在seta 中,定义一个函数

          def afunction(self):
              self.a = 4
      

      ...如果它会被调用,会将self.a 设置为 4。但是它没有在任何地方调用,所以a 没有改变。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 这应该行不通。至少在 Python 3 中,你会得到一个错误missing 1 required positional argument: 'self'。您将需要调用functiona(self),但这种解决方案对于定义嵌套函数仍然是多余的。
        • 您没有注意到这是在原始问题的类范围内定义的东西。
        【解决方案5】:

        如何使它等于 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 有“afunction”嵌套在内部但不被调用...类似于类中的成员变量。

        【讨论】:

          猜你喜欢
          • 2021-05-21
          • 1970-01-01
          • 2016-11-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          相关资源
          最近更新 更多