考虑以下Python 3代码:
class A:
b = LongRunningFunctionWithSideEffects()
什么时候会召唤LongRunningFunctionWithSideEffects()
?目前模块已导入?还是目前该类首次以某种方式使用?
目前模块已导入
test.py
:
def x():
print('x')
class A:
x = x()
然后
Python 3.6.7 (default, Oct 22 2018, 11:32:17)
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
x
当遇到 class
语句时,类中的代码运行 - 即在导入过程中。
这是因为,与 Java 或 C# 类定义不同,Python class
语句实际上是可执行代码。
class A:
print("I'm running!") # yup, code outside a method or field assignment!
b = print("Me too!")
print("Wait for me!")
结果按执行顺序整齐:
I'm running!
Me too!
Wait for me!
它是在导入时完成的。这些变量称为静态变量,在类级别定义。这些变量是每个类创建 1 个,而不是每个对象创建 1 个。它们是加载导入时发生的类的一部分。
下面是一个示例:
classA.py
class A:
print("Printing before Static Variable Creation")
class_var = 1
def __init__(self):
instance_var = 2
main.py
from classA import A
创建静态变量之前打印
print('Printing Class Variable Value : ',A.class_var)
打印类变量值:1
print(A.__dict__)
{'module': 'classA', "class_var": 1, 'init':函数类A.A.初始化(自身), "字典":属性"A"对象的"字典", "弱引用":属性"A"对象的"弱引用", "文档":无}