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

猜你喜欢

转载自blog.csdn.net/u010895119/article/details/79418300
今日推荐