一、学前花絮

在python程序编写过程当中,会经常遇到一个变量共享的问题。比如一个学校有多个班级,而很多班级会共享同样一门课程及教师,那么我们在定义这些班级的时候,如果把课程或教师当做变量的话,这些变量就是共享变量;另一种情况,我们之前学习过python连接mysql数据库,而数据库的功能操作很多,比如查询、修改、插入等等操作,这些操作可以定义成独立的函数,而这些独立的函数都要先连接数据库,这个连接数据库的动作也可以定义成一个变量,那么如何共享这个变量呢?

本质上,这个问题本质上就是前面的文章“python命名空间和作用域”所说的,对于一个相对复杂的程序或者工程项目,如何在类、函数中共享变量,也就是这个变量的命名空间和作用域的问题。

我们前面的文章也介绍了类、对象的使用,我们是否可以简单的认为只要在类中的__init__函数中定义了一个变量,就可以共享给其他类函数了呢?

二、Python 类中共享变量

在 Python 中,让类中的函数(方法)共享同一个变量,并非必须在 __init__ 中定义,而是有多种实现方式,具体取决于变量的作用域(实例级、类级)和初始化时机。__init__ 只是最常用的实例变量初始化入口,下面分场景详细说明:

2.1实例级共享变量(每个实例独立)

如果变量是实例专属的(不同实例的该变量值不同),最常用的方式是在 __init__ 中定义,但也可通过其他方式初始化。

1. 推荐:在 __init__ 中定义(最规范)

__init__ 是类的构造方法,创建实例时会自动执行,是初始化实例变量的标准入口。通过 self.变量名 绑定的变量,可被该实例的所有方法共享。

init方法的使用

输出如下:

输出结果

2. 其他方式:在类的普通方法中定义实例变量

实例变量本质是通过 self.变量名 绑定到实例上的,只要在调用其他方法前完成绑定,即使不在 __init__ 中定义,也能被共享。

  • 注意:若未初始化就调用方法,会抛出 AttributeError,因此这种方式不如 __init__ 规范。

实例变量

2.2类级共享变量(所有实例共用)

如果变量是所有实例共享的(一个实例修改,所有实例都会看到变化),直接在类体中定义类变量即可,无需在 __init__ 中定义。

类变量通过 类名.变量名 或 self.变量名(实例会优先查找实例变量,无则找类变量)访问,可被类的所有方法共享。

1.定义类变量(类体中直接声明)

类变量

输出如下:

输出结果

Python学习【43】:python程序如何共享同一个变量

适用场景:需要所有实例共享的状态(如计数器、全局配置)。

2.静态变量(类内常量)

通过 @staticmethod 或类内独立作用域定义的常量,无需 __init__,但本质是类级别的变量:

静态常量

输出如下:

输出结果

总结上述对于共享变量的使用:

  1. 实例变量:推荐在 __init__ 中定义(避免未定义错误),也可动态创建;
  2. 类变量:无需在 __init__ 中定义,所有实例共享;

核心原则:__init__ 是实例初始化的 “标准入口”,优先在此定义实例变量,类变量直接定义在类体中。

如果你的需求是 “每个实例有自己的独立变量,且所有方法都能访问”,则必须(推荐)在 __init__ 中定义;如果是 “所有实例共享同一个变量”,则直接定义类变量即可,无需 __init__。

三、小结

今天我们学习了Python的共享变量功能,随着我们学习的深入,我们会遇到各种问题。只有勤于思考,才能体会那些细微之处。而一个好的程序,是需要多次打磨的。同样,一个好的程序员,也不是一天养成的。

让我们保持学习热情,多做练习。我们下期再见!

快乐男孩

#python#