考虑以下Python 3代码:
A类:
b = LongRunningFunctionWithSideEffects()
何时会调用 LongRunningFunctionWithSideEffects()
?目前该模块已导入?还是目前以某种方式第一次使用该类?
答案 0 :(得分:4)
当遇到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 :(得分:3)
当前模块已导入
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
答案 2 :(得分:1)
在导入时完成。这些称为静态变量,并在类级别定义。这些变量每个类创建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__)
{'模块':'classA', 'class_var':1, ' init ':函数类A.A. init (自身), ' dict ':'A'对象的属性' dict ', '弱引用':'A'个对象的属性'弱引用”, ' doc ':无}