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

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

# 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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值