设计模式之单例模式(Python实现)

先认识下什么是单例模式,可以参考前人的优秀分析https://blog.csdn.net/lovelion/article/details/9319181

总结起来说,当我们在代码中频繁的创建和删除对象时会消耗大量资源,拖慢运行效率,如果这些对象是重复的,那么完全不必如此,只需要保持一个对象即可

实现上就需要全局在例化该对象时只例化一次,后续例化及使用都返回这个对象

下面用Python的几种方法来实现单例模式

1、在类的构造函数中实现

python中的类的构造函数是cls.__new__(),在该函数中维持一个全局对象即可

 1 #coding:utf-8
 2 
 3 class M():
 4     _singleInstance = None
 5     
 6     def __new__(cls,*a,**k):
 7         if not cls._singleInstance:
 8             cls._singleInstance = object.__new__(cls, *a, **k)
 9         return cls._singleInstance 
10 
11     def __init__(self):
12         pass
13 ...

__new__构造函数返回一个实例对象,object是Python所有类的基类,该方法也可以在基类上实现让子类继承

2、使用装饰器

python中使用装饰器是比较灵活的方式,可以不修改原有类的代码结构,只添加功能,具体实现方式如下

 

 1 #coding:utf-8
 2 from functools import wraps
 3 
 4 
 5 def Singleton(cls):
 6     instances = {}
 7 
 8     @wraps(cls)
 9     def _singleton(*args, **kwargs):
10         if cls not in instances:
11             instances[cls] = cls(*args, **kwargs)
12         return instances[cls]
13     return _singleton
14 
15 @Singleton
16 class M():
17     def __init__(self):
18         pass
19         ...

 

 

 

 

多线程下的方式还未进行过验证,暂不讨论

posted on 2022-09-01 09:26  ZhangCheng2020  阅读(78)  评论(0)    收藏  举报