仅导入Python模块时类中代码被执行是否符合预期?有无相关文档?
问题解答
现象是否符合预期?
完全符合预期,核心原因是Python对函数默认参数的求值时机规则:
- Python中,函数(包括类的构造方法
__init__)的默认参数值是在函数定义阶段计算的,而非调用阶段。 - 在
a_module.py定义class B时,其__init__方法的默认参数p:str = A().parameter会被立即执行:实例化A类,触发A的__init__方法,因此打印出class A is executed。 class C的__init__方法内的c = A().parameter属于方法内部逻辑,只有当C被实例化(即调用C())时才会执行,模块导入阶段不会触发。class A的定义本身不会执行其__init__,只有实例化操作才会触发,这里是B的默认参数定义触发了A的实例化。
官方文档是否提及该行为?
Python官方文档明确记载了这一行为:函数的默认参数会在函数定义时被求值,且仅求值一次。这个规则不仅适用于可变对象(比如列表、字典)引发的常见陷阱,也适用于本例中通过实例化类来获取默认值的场景,本质都是同一求值时机规则的体现。
内容的提问来源于stack exchange,提问作者Kevin Zou
相关产品推荐
相关产品推荐

