我对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}}之前。
但我不喜欢编码基础领域的猜测。 有人可以为这个问题提供更好的解释或官方材料吗?
感谢您提前回答。
答案 0 :(得分:5)
您的解释是正确的:
类名绑定是在执行类块之后和执行功能块之前。
这只是说立即执行类块,而在调用函数之前不执行功能块。请注意,在两种情况下,名称都不会在创建对象(类或函数)之后绑定;只是函数体在创建函数后执行,而类体在创建类之前执行(作为类创建过程的一部分)。
这是因为类和函数是不同的类:当你定义一个类时,你正在定义“现在”类应包含的内容(即它的方法和属性);当你定义一个函数时,你正在定义在稍后的某个时候(当你调用它时)会发生什么。
类定义是可执行语句。它首先评估继承列表(如果存在)。 [...]然后执行该类的套件[...]
在执行class
语句时执行类主体。这与其他一些语言不同,其中类定义是一个“声明”,它不像其他语句那样以源文件的线性顺序执行。 (我相信很明显为什么在定义函数时函数体不执行 - 如果函数刚刚立即运行,将代码放入函数中就没有多大意义了。)