我对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()statement调试这两个代码。我发现 类块 中class Foo的全局变量dict不包含,而__init__ 功能块 中的全局变量dict 包含了它。
print globals()
class Foo
__init__
因此,似乎类名称绑定是在执行 类块 之后,在执行 功能块之前 。
但是我不喜欢编码基础领域的猜测。有人可以对此提供更好的解释或官方材料吗?
您的解释是正确的:
类名绑定是在类块执行之后,功能块执行之前。
这只是说立即执行一个类块,而直到调用该函数才执行一个功能块。请注意,在这两种情况下,直到创建对象(类或函数)后,名称才被绑定。只是函数体是 在 创建函数 之后 执行的,而类体是在创建类 之前 执行的(作为类创建过程的一部分)。
这是因为类和函数是不同的野兽:当您定义一个类时,您正在“立即”定义该类应包含的内容(即,其方法和属性);当您定义函数时,您正在定义稍后要发生的事情(当您调用它时)。
该文档明确指出:
类定义是可执行语句。它首先评估继承列表(如果存在)。[…]然后执行该类的套件[…]
类主体在执行class语句时执行。这与某些其他语言不同,在其他语言中,类定义是“声明”,不会像其他语句那样按源文件的线性顺序执行。(我相信很明显为什么在定义函数时 不 执行函数主体—如果立即运行代码,将代码放入函数中没有多大意义。)
class