为什么 class 中的代码在定义时执行,而函数中的代码直到被调用时才执行?
Why the code inside a class is executed when defined but a code inside a function is not executed until it gets called?
我对这种行为感到困惑,
def calc():
print ("function .. calculating")
class Calc:
print ("Class .. calculating")
生成此输出:
Class .. calculating
为什么即使我们没有调用它或创建对象,class 中的代码也会被执行,而函数中的代码在我们调用它之前不会执行?
我完全同意蒂姆·罗伯茨的观点。我不是这里的专家,但对于下面的特定用例,该行为很有用。
class Foo:
bar = 'Baz'
print(Foo.bar)
这样,你可以存储一些数据,而不需要实例化它来使用底层数据。
但是,如果你想在 class 实例上使用它,它也是可用的。
f = Foo()
print(f.bar)
这就是语言的设计方式。 class 主体在定义 class 时执行。您可以在文档中阅读更多内容:9.3.1. Class Definition Syntax
该语句不属于 __init__
之类的任何方法或 class 中的任何方法。由于这个语句不是任何方法的一部分,解释器在调用 __init__
方法之前执行它(在这种情况下是隐式的)。调用__init__
方法是指当你创建这个class的对象时调用__init__
。这就是打印出来的原因。
还有一点很好,当你实例化对象时,它会被执行多次。因为只有当解释器获得 class 定义时它才会执行一次。 (来自与 Iain Shelvington 的讨论)
从这个输出中会更清楚。
class Calc:
print ("Class .. calculating")
print(ab) #throws error
def __init__(self):
print('init')
在这种情况下,如果之前没有使用 ab
就会抛出错误。非常重要的是:它所属的命名空间,检查这个:
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
print(ab) #throws error
现在它会再次抛出错误。因为它是在 class 内声明的。但是您可以实例化 class 的对象并将其作为 class 范围的一部分进行访问。
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
calc = Calc()
calc.ab # 2
您可以进一步检查 reference。我只想强调这个范围涉及的微妙之处
When a class definition is left normally (via the end), a class object
is created. This is basically a wrapper around the contents of the
namespace created by the class definition; we’ll learn more about
class objects in the next section. The original local scope (the one
in effect just before the class definition was entered) is reinstated,
and the class object is bound here to the class name given in the
class definition header (ClassName in the example).
我对这种行为感到困惑,
def calc():
print ("function .. calculating")
class Calc:
print ("Class .. calculating")
生成此输出:
Class .. calculating
为什么即使我们没有调用它或创建对象,class 中的代码也会被执行,而函数中的代码在我们调用它之前不会执行?
我完全同意蒂姆·罗伯茨的观点。我不是这里的专家,但对于下面的特定用例,该行为很有用。
class Foo:
bar = 'Baz'
print(Foo.bar)
这样,你可以存储一些数据,而不需要实例化它来使用底层数据。 但是,如果你想在 class 实例上使用它,它也是可用的。
f = Foo()
print(f.bar)
这就是语言的设计方式。 class 主体在定义 class 时执行。您可以在文档中阅读更多内容:9.3.1. Class Definition Syntax
该语句不属于 __init__
之类的任何方法或 class 中的任何方法。由于这个语句不是任何方法的一部分,解释器在调用 __init__
方法之前执行它(在这种情况下是隐式的)。调用__init__
方法是指当你创建这个class的对象时调用__init__
。这就是打印出来的原因。
还有一点很好,当你实例化对象时,它会被执行多次。因为只有当解释器获得 class 定义时它才会执行一次。 (来自与 Iain Shelvington 的讨论)
从这个输出中会更清楚。
class Calc:
print ("Class .. calculating")
print(ab) #throws error
def __init__(self):
print('init')
在这种情况下,如果之前没有使用 ab
就会抛出错误。非常重要的是:它所属的命名空间,检查这个:
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
print(ab) #throws error
现在它会再次抛出错误。因为它是在 class 内声明的。但是您可以实例化 class 的对象并将其作为 class 范围的一部分进行访问。
class Calc:
print ("Class .. calculating")
ab=2
def __init__(self):
print('init')
calc = Calc()
calc.ab # 2
您可以进一步检查 reference。我只想强调这个范围涉及的微妙之处
When a class definition is left normally (via the end), a class object is created. This is basically a wrapper around the contents of the namespace created by the class definition; we’ll learn more about class objects in the next section. The original local scope (the one in effect just before the class definition was entered) is reinstated, and the class object is bound here to the class name given in the class definition header (ClassName in the example).