【问题标题】:How can I access a class variable in an initializer in Python?如何在 Python 的初始化程序中访问类变量?
【发布时间】:2013-06-07 09:33:32
【问题描述】:

我认为 Python 中的 class 语句会创建一个作用域。但是尝试这个简单的代码我得到一个错误:

class A():
    foo = 1 
    def __init__(self):
        print foo 

a = A() 

NameError: global name 'foo' is not defined

为什么不能从初始化程序访问foo?访问它的正确方法是什么?

【问题讨论】:

    标签: python scope python-2.x


    【解决方案1】:

    创建范围。这记录在pep 227:

    类范围内的名称不可访问。名称在 最里面的封闭函数范围。如果一个类定义 发生在嵌套范围链中,解析过程跳过 类定义。

    class compound statement documentation:

    然后使用新创建的本地命名空间和原始全局命名空间在新的执行框架中执行该类的套件(参见Naming and binding 部分)。 (通常,套件只包含函数定义。)当类的套件完成执行时,其执行帧被丢弃,但其本地命名空间被保存[4] 然后使用基类的继承列表和属性字典的保存的本地命名空间创建一个类对象。

    强调我的;执行框架是一个临时范围。

    要访问foo,请使用self.foo

    class A():
        foo = 1 
        def __init__(self):
            print self.foo 
    

    或按名称访问A 类,或使用type(self) 访问当前 类(可能是子类):

    def __init__(self):
        print A.foo 
    

    def __init__(self):
        print type(self).foo 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-04
      • 1970-01-01
      • 2015-08-24
      • 2012-01-20
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 2023-02-14
      相关资源
      最近更新 更多