什么是单例模式
- 我们节选一段网上的话:单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
- 举个例子,就像我们新定义一个类,去发送短信验证码。一个用户请求时会创建一个实例对象去处理。多个用户请求时,便会创建多个实例对象去处理。这大大的占用了内存空间,严重浪费内存资源。
- 所以我们要做的,就是实现单例设计模式,我们希望在程序运行期间只存在一个发送验证码类的实例对象。
如何实现单例模式
- 我们这里不重点去讲解单例模式。 因为实现方法很多,这是一个很重要的设计模式,内容分也很多。
- **最常用的,也是最方便的方法就是 就是使用 new**方法来实现。
什么是__new__ 方法;
- 让我们打开官方文档关于类定义,以及实例创建的部分:
可以看到类‘加工制作’实例对象,首先通过 __new__方法创建实例对象,再调用 __init__方法进行 对实例的个性化,也就是初始化。
这就是__new__方法了。如果你详细解的了解其过程以及原理,强烈建议根据我的标记,重点阅读文档进行理解,兴趣足时,可以去阅览 底层Cpython源码。理解底层C的实现!
__new __方法实现单例模式的 原理。
- 理解了__new__方法的作用,不难猜出,如何实现单例模式。 类的实例创建时,本身就是 首先通过这个方法创建的,然后再通过 __init__方法进行初始化的。
- 所以: 我们只需要重写这个object的__new__方法,使其保持只有单个实例被创建就可以啦!简单方便。
hasatter方法
- 正如下图所示,这个方法的作用就是 查看一个属性 是否属于一个对象。
- 对于其底层调用的 getattr方法,不多介绍,是底层属性调用的时候,先调用getattribute方法,之后找不到报错,才回去调用 getattr,想仔细理解的,可以自己去阅读官方文档哈~
- hasatter
正式设计发送短信验证码的类,单例模式。
- 上代码:
class CCP(object):
"""发送短信的辅助类"""
def __new__(cls, *args, **kwargs):
# 判断是否存在类属性_instance,_instance是类CCP的唯一对象,即单例
if not hasattr(CCP, "_instance"):
# 调用父类的(object)的__new__方法,创建实例对象 _instance
cls._instance = super(CCP, cls).__new__(cls, *args, **kwargs)
# 手动添加实例对象的属性,不通过调用__init__ 方法初始化实例对象
# 和Demo一样,实例化REST类,然后将实例化的 REST对象当做 CPP实例对象的属性
cls._instance.rest = REST(_serverIP, _serverPort, _softVersion)
cls._instance.rest.setAccount(_accountSid, _accountToken)
cls._instance.rest.setAppId(_appId)
return cls._instance
def send_template_sms(self, to, datas, temp_id):
"""发送模板短信"""
# @param to 手机号码
# @param datas 内容数据 格式为数组 例如:{'12','34'},如不需替换请填 ''
# @param temp_id 模板Id
result = self.rest.sendTemplateSMS(to, datas, temp_id)
# 如果云通讯发送短信成功,返回的字典数据result中statuCode字段的值为"000000"
if result.get("statusCode") == "000000":
# 返回0 表示发送短信成功
return 0
else:
# 返回-1 表示发送失败
return -1
解释我已经在代码中写的很详细了~ ,大家有疑问欢迎交流!
over!