何时在 Python 中初始化类变量



考虑以下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"对象的"弱引用", "文档":无}

最新更新