文章目录
- 类变量
- 单例模式
作者:小猪快跑
基础数学&计算数学,从事优化领域6年+,主要研究方向:MIP求解器、整数规划、随机规划、智能优化算法
静态变量(Static Variable)在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。
Python 并没有静态变量,但我们可以通过一些技巧来实现这样的效果。
如有错误,欢迎指正。如有更好的算法,也欢迎交流!!!——@小猪快跑
类变量
我们先来看一个例子,容易发现类的成员变量就类似静态变量,但实例化后的成员变量就不是了。操作类的成员变量会影响实例化后成员变量,反之不会。
如果使用多线程,也没问题。
import threadingclass Foo:a = 0@staticmethoddef increment():Foo.a += 1if __name__ == '__main__':print('===== start =====')print("Foo().a:", Foo().a)print("Foo.a:", Foo.a)print('===== Foo.a += 1 =====')Foo.a += 1print("Foo().a:", Foo().a)print("Foo.a:", Foo.a)print('===== foo.a += 1 =====')foo = Foo()foo.a += 1print("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)
===== 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)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
下面的例子希望读者要注意的是,虽然单例模式只有一个实例存在,但实例的成员变量和类成员变量并不指向同一个变量。
如果使用多线程,也没问题。
import threadingclass Singleton:_instance_lock = threading.Lock()count = 0def __init__(self):passdef __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._instancedef increment():Singleton().count += 1if __name__ == '__main__':Singleton().count = 1Singleton().count += 2print(Singleton().count) # 3print(Singleton.count) # 0threads = [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