您的位置:首页 > 编程语言 > Python开发

Python 类变量(类名不加括号访问的变量)

2018-03-01 22:51 288 查看
起因:

下面一段代码没有达到预期

# 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: