函数/方法块中的代码在调用函数之前不会执行。而且CPython语言实现(这是最常见的实现,也是您可能正在使用的实现)不像C等语言那样在编译时进行名称检查。因为它主要是一种解释性语言,它会在运行时动态检查名称空间中是否有可用的名称。在
此外,关于Python您应该知道,类中的代码是在类创建时执行的,而使用in方法/函数的代码则不是。def语句只是将函数的名称添加到命名空间中。在调用函数之前,它不会在函数本身内运行任何代码。在
考虑下面的合法Python代码。在class Something:
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是完全合法的,因为在定义Dog类之前,__init__不运行。但是如果我们把构造函数移到类Dog的创建之上呢?在
此代码将抱怨名称错误,因为Dog尚未定义!在
^{pr2}$
最后一个例子。。。在
此代码将抱怨相同的名称错误。在class Something:
my_puppy = Dog()
def __init__(self):
self.puppy = Dog()
class Dog:
def __init__(self):
pass
inst = Something()
这是因为Something中的所有代码都将立即执行,并且在执行过程中,命名空间/作用域不能访问名称Dog。在