起因:
下面一段代码没有达到预期
# config.py
class GlobalVar():
is_init = False
def set_init_status(is_init):
GlobalVar().is_init = is_init
def get_init_status():
return GlobalVar().is_init
if __name__ == "__main__":
set_init_status(True)
print(get_init_status())
# 结果:False
查了原因,修改成这样就好了:
def set_init_status(is_init):
GlobalVar.is_init = is_init
def get_init_status():
return GlobalVar.is_init
即将GlobalVar().is_init改为GlobalVar.is_init
第一种代码分析
GlobalVar().is_init,是访问的对象变量,相当于先创建一个对象是GlobalVar(),将这个对象中的is_init改为True,即等同于下面的写法:
def set_init_status(is_init):
a_object = GlobalVar()
a_object.is_init = is_init
在调用这个方法get_init_status()时,等同于:
def get_init_status():
b_object = GlobalVar()
return b.is_init
前一个方法将对象a_object.is_init=True,再去查b_object.is_init当然还是False
第二种代码分析
GlobalVar.is_init是类变量的访问方法,因此第二种方法其实是在修改类变量、访问类变量,因此达到了原来代码的预期。因此即使get_init_status()方法内也是访问的对象变量,结果仍然是True,因为类变量对于所有的类的实例(对象)都是共享的。
参考
兜兜转转总会解释很多疑惑的Python简明教程:https://bop.mol.uno/14.oop.html