【问题标题】:Why is this closure not possible in python?为什么这个闭包在 python 中是不可能的?
【发布时间】:2013-10-07 11:41:28
【问题描述】:

在 python 中,我可以从内部函数访问外部函数中的变量,因此它形成了一个闭包。但是,我无法像这样从内部类访问外部类中的变量,

>>> class A:
...  a=1
...  class B:
...    b=1
...    def pr(self):
...     print a,b
...
>>> c=A().B()
>>> c.pr()
    Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 6, in pr
NameError: global name 'a' is not defined

为什么这种闭包在 python 中是不可能的?

【问题讨论】:

  • 简短的回答是:因为类范围很奇怪。
  • 你也可以通过一个类得到这个错误:example。所以这可能不是类中类的问题。
  • @delnan 我已经看到很多关于这个的问题。也许是时候打开一个“类范围如何在 python 中工作?” CW 问题并用它来关闭所有这些重复项。但是,已经有一些问题有很好的答案,例如this(虽然不是 100% 完整),但问题的标题具有误导性,因此不常用于关闭重复项。

标签: python closures


【解决方案1】:

docs say

类块中定义的名称范围仅限于类 堵塞;它没有扩展到方法的代码块

类块的范围也没有扩展到嵌套类语句的代码块。


不清楚(对我来说)您要做什么,但这是一个更典型的模式,它使 B 成为 A 的子类,因此允许 B 的实例访问 @987654325 的属性@和A

class A:
    a=1

class B(A):
    b=1
    def pr(self):
        print self.a, self.b

c = B()
c.pr()

打印

1 1

【讨论】:

    【解决方案2】:

    您可以访问这些类变量,但前提是您使用定义它的类的名称来限定每个变量:

    class A:
        a=1
        class B:
            b=1
            def pr(self):
                print A.a, A.B.b
    
    c=A().B()
    c.pr()
    

    结果:

    1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 2014-03-24
      • 1970-01-01
      • 2013-11-15
      • 2014-08-13
      相关资源
      最近更新 更多