9

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

函数块中使用函数名是很正常的,例如:

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

但是当我尝试在类块中使用类名时,事情就出错了:

class Foo(object):
    a = Foo
NameError: name 'Foo' is not defined

虽然下面的代码没问题:

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

print globals()然后我使用语句调试这两个代码。我发现类块中的全局变量dict不包含class Foo,而 __init__ 功能块中的全局变量dict包含它。

因此,类名绑定似乎是在执行类块之后和执行功能块之前。

但我不喜欢在编码的基础领域进行猜测。任何人都可以对此提供更好的解释或官方材料吗?

4

1 回答 1

6

你的解释是正确的:

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

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

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

文档清楚地表明:

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

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

于 2013-10-27T19:40:55.427 回答