如何在python的类范围中使用类名?

时间:2013-10-27 19:37:50

标签: python

我对Python不太熟悉。所以我在编码时遇到了一些问题。

function name中使用function block是很正常的,例如:

def f(n):
    if n == 1:
        return n
    else:
        return n * f(n-1)

但是当我尝试在class name中使用class block时,事情就出错了:

class Foo(object):
    a = Foo

NameError: name 'Foo' is not defined

虽然下面的代码没问题:

class Foo(object):
    def __init__(self):
        a = Foo

然后我使用print globals()语句调试这两个代码。我发现class block中的全局变量字典不包含class Foo,而__init__ function block中的全局变量字典包含class block

所以看起来类名绑定是在执行function block之后和执行{{1}}之前。

但我不喜欢编码基础领域的猜测。 有人可以为这个问题提供更好的解释或官方材料吗?

感谢您提前回答。

1 个答案:

答案 0 :(得分:5)

您的解释是正确的:

  

类名绑定是在执行类块之后和执行功能块之前。

这只是说立即执行类块,而在调用函数之前不执行功能块。请注意,在两种情况下,名称都不会在创建对象(类或函数)之后绑定;只是函数体在创建函数后执行,而类体在创建类之前执行(作为类创建过程的一部分)。

这是因为类和函数是不同的类:当你定义一个类时,你正在定义“现在”类应包含的内容(即它的方法和属性);当你定义一个函数时,你正在定义在稍后的某个时候(当你调用它时)会发生什么。

The documentation说清楚:

  

类定义是可执行语句。它首先评估继承列表(如果存在)。 [...]然后执行该类的套件[...]

在执行class语句时执行类主体。这与其他一些语言不同,其中类定义是一个“声明”,它不像其他语句那样以源文件的线性顺序执行。 (我相信很明显为什么在定义函数时函数体执行 - 如果函数刚刚立即运行,将代码放入函数中就没有多大意义了。)