- 内容:保证一个类只有一个实例,并提供一个访问它的全局访问点
- 角色:
- 单例(Singleton)
- UML图
- 举个例子:
需求:一个类只能实例化一个对象,不能实例化多个对象
from abc import abstractmethod,ABCMeta
'''
__new__:
在基础类object中,__new__被定义成了一个静态方法,并且需要传递一个参数cls。Cls表示需要实例化的类,此参数在实例化时由Python解析器自动提供。
new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,可以这么理解,
在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,
new()决定是否要使用该init()方法,
因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
hasattr(cls,"_instance"):
判断这个类是否已经实例化
'''
class Singleton:
def __new__(cls, *args, **kwargs):
# 如果没有实例化,就实例化
if not hasattr(cls,"_instance"):
cls._instance=super(Singleton,cls).__new__(cls)
return cls._instance
class MyClass(Singleton):
def __init__(self,a):
self.a=a
a=MyClass(10)
b=MyClass(20)
print(a.a)
print(b.a)
print(id(a),id(b))
输出结果
20
20
139718467807696 139718467807696
说明是同一个对象
- 优点:
- 对唯一实例的受控访问
- 单例相当于全局变量,但访问了命名空间被污染