为什么在python中不能实现这种闭包?

时间:2013-10-07 11:41:28

标签: python closures

在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中不能实现这种关闭?

2 个答案:

答案 0 :(得分:2)

docs say

  

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

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


我不清楚(对我而言)你想要做什么,但这是一个更典型的模式,它使B成为A的子类,从而允许B的实例1}}访问BA的属性:

class A:
    a=1

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

c = B()
c.pr()

打印

1 1

答案 1 :(得分:1)

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

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

c=A().B()
c.pr()

结果:

1 1