【附代码】Python 静态变量的实现方法(可多线程)

文章目录

作者:小猪快跑

基础数学&计算数学,从事优化领域6年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法

静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。

Python 并没有静态变量,但我们可以通过一些技巧来实现这样的效果。

如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!------@小猪快跑

类变量

我们先来看一个例子,容易发现类的成员变量就类似静态变量,但实例化后的成员变量就不是了。操作类的成员变量会影响实例化后成员变量,反之不会。

如果使用多线程,也没问题。

python 复制代码
import threading


class Foo:
    a = 0

    @staticmethod
    def increment():
        Foo.a += 1


if __name__ == '__main__':
    print('===== start =====')
    print("Foo().a:", Foo().a)
    print("Foo.a:", Foo.a)

    print('===== Foo.a += 1 =====')
    Foo.a += 1
    print("Foo().a:", Foo().a)
    print("Foo.a:", Foo.a)

    print('===== foo.a += 1 =====')
    foo = Foo()
    foo.a += 1
    print("foo.a:", foo.a)
    print("Foo().a:", Foo().a)
    print("Foo.a:", Foo.a)

    print('===== 10 threads foo.a += 1 =====')
    threads = [threading.Thread(target=Foo.increment) for i in range(10)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print("Foo.a:", Foo.a)
bash 复制代码
===== start =====
Foo().a: 0
Foo.a: 0
===== Foo.a += 1 =====
Foo().a: 1
Foo.a: 1
===== foo.a += 1 =====
foo.a: 2
Foo().a: 1
Foo.a: 1
===== 10 threads foo.a += 1 =====
Foo.a: 11

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。

下面的例子希望读者要注意的是,虽然单例模式只有一个实例存在,但实例的成员变量和类成员变量并不指向同一个变量

如果使用多线程,也没问题。

python 复制代码
import threading


class Singleton:
    _instance_lock = threading.Lock()
    count = 0

    def __init__(self):
        pass

    def __new__(cls, *args, **kwargs):
        if not hasattr(Singleton, "_instance"):
            with Singleton._instance_lock:
                if not hasattr(Singleton, "_instance"):
                    Singleton._instance = object.__new__(cls)
        return Singleton._instance


def increment():
    Singleton().count += 1


if __name__ == '__main__':
    Singleton().count = 1
    Singleton().count += 2
    print(Singleton().count)  # 3
    print(Singleton.count)  # 0

    threads = [threading.Thread(target=increment) for i in range(10)]
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print(Singleton().count)  # 13
相关推荐
理智.6296 分钟前
Cursor 中使用 Conda 虚拟环境常见问题与彻底解决方案(踩坑实录)
python·conda
aiguangyuan16 分钟前
中文分词与文本分析实战指南
人工智能·python·nlp
小二·17 分钟前
Python Web 开发进阶实战:量子机器学习实验平台 —— 在 Flask + Vue 中集成 Qiskit 构建混合量子-经典 AI 应用
前端·人工智能·python
one____dream30 分钟前
【网安】pwn-ret2shellcode
python·安全·网络安全·网络攻击模型
HellowAmy30 分钟前
我的C++规范 - 随机时间点
开发语言·c++·代码规范
郝学胜-神的一滴44 分钟前
深入解析C/S架构与B/S架构:技术选型与应用实践
c语言·开发语言·前端·javascript·程序人生·架构
啊阿狸不会拉杆1 小时前
《计算机操作系统》第七章 - 文件管理
开发语言·c++·算法·计算机组成原理·os·计算机操作系统
给你一页白纸1 小时前
将分散的Pytest测试脚本统一接入测试平台:FastAPI改造方案详解
python·pytest·接口自动化·测试平台
孤狼warrior1 小时前
图像生成 Stable Diffusion模型架构介绍及使用代码 附数据集批量获取
人工智能·python·深度学习·stable diffusion·cnn·transformer·stablediffusion
s19134838482d1 小时前
javascript练习题
开发语言·javascript·ecmascript