Python 类变量(类名不加括号访问的变量)
2018-03-01 22:51
288 查看
起因:
下面一段代码没有达到预期
查了原因,修改成这样就好了:
即将GlobalVar().is_init改为GlobalVar.is_init
在调用这个方法get_init_status()时,等同于:
前一个方法将对象a_object.is_init=True,再去查b_object.is_init当然还是False
参考
兜兜转转总会解释很多疑惑的Python简明教程:https://bop.mol.uno/14.oop.html
下面一段代码没有达到预期
# 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
相关文章推荐
- python global语句和其他访问全局变量的方法
- 零基础学python-16.5 模块间全局变量的修改以及其他访问全局变量的方法
- Python 2.x闭包(enclosure)中的变量访问&修改
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- python 类的函数,类方法,静态方法,类变量,实例变量浅析
- python中的实例方法、静态方法、类方法、类变量和实例变量
- Java学习笔记之变量和类变量的访问哲学
- Python3基础 nonlocal关键字 内部函数访问到外部函数的变量
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- Python 内层名字空间访问外层名字空间中的变量
- Python基础_私有变量访问限制
- python中的实例方法、静态方法、类方法、类变量和实例变量
- Python双下划线引发的学习-类变量、实例变量
- Python中的实例变量和类变量
- Python的类方法,静态方法,实例方法,类变量,实例变量,静态变量的总结
- python中的实例方法、静态方法、类方法、类变量和实例变量浅析
- Python 访问私有变量和私有方法
- python篇8_python中的变量和访问权限
- Python中设置变量访问权限的方法
- python的私有变量 是类变量吗?