实现单例模式(Singleton)
一、单例模式的概念
概念:
单例模式也叫做单子模式,单例对象的类必须保证只有一个实例存在。
通过覆盖__new__()函数实现单例。
class Singleton(object):
def __new__(cls, *args, **kwargs):
# hasattr() 函数用于判断对象是否包含对应的属性
if not hasattr(cls, "__me")
cls.__me = object.__new__(Singleton)
return cls.__me
二、单例模式实例
代码实现:
# 通过重写__new__()方法实现单例
class Singleton(object):
# 单例模式的类
def __new__(cls, *args, **kwargs):
# 1、cls._me 表示cls对象添加一个受保护的属性
# 2、如果属性不存在,就创建这个属性并赋值为当前类的实例(唯一一次实例化当前类)
# 3、如果_me属性存在, 就直接返回这个属性的值即可
if not hasattr(cls, "_me"): # 这里用受保护的或者共有变量,不要用私有变量
cls._me = super().__new__(Singleton)
# 等价写法
# setattr(cls, "_me", object.__new__(Singleton))
return cls._me
if __name__ == '__main__':
s1 = Singleton()
s2 = Singleton()
print("s1的地址为:",id(s1))
print("s2的地址为:",id(s2))
# 如果上面的_me,定义为私有的__me,那么两个地址不相同(共有的和保护的地址是相同的)
打印结果:
s1的地址为: 63950888
s2的地址为: 63950888
小结: 为了只实例化一个对象,所有用单例模式