单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。 当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, ‘_instance‘): # 判断是否有_instance属性
cls._instance = super().__new__(cls, *args, **kwargs)
return cls._instance
return cls._instance
name = ‘SR‘
s1 = Singleton()
s2 = Singleton()
print(s1.name) # SR
print(s2.name) # SR
print(id(s1)) # 140368628557584
print(id(s2)) # 140368628557584
print(s1 == s2) # True
print(s1 is s2) # True
本质上是方法一的升级版,使用metaclass(元类)的python高级用法,具体代码如下
"""
class Singleton中的__init__在Myclass声明的时候被执行Myclass=Singleton()
Myclass()执行时,最先执行父类的__call__方法(object,Singleton都作为Myclass的父类,
根据深度优先算法,会执行Singleton中的__call__(),Singleton中的__call__()写了单例模式)
"""
class Singleton(type):
def __init__(self, name, bases, dict):
super(Singleton,self).__init__(name,bases, dict)
self._instance = None
def __call__(self, *args, **kwargs):
if self._instance is None:
self._instance = super(Singleton,self).__call__(*args, **kwargs)
return self._instance
class MyClass(object,metaclass=Singleton):
a = 1
one=MyClass()
two=MyClass()
print(id(one)) # 1553247294800
print(id(two)) # 1553247294800
print(one == two) # True
print(one is two) # True
def singleton(cls, *args, **kwargs):
instances = {}
def _singleton():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _singleton
@singleton
class MyClass3(object):
a = 1
one = MyClass3()
two = MyClass3()
print(id(one)) # 140383866774528
print(id(two)) # 140383866774528
print(one == two) # True
print(one is two) # True
python的单例模式__new__()在__init__()之前被调用,用于生产实例对象。利用这个方法和类的属性的特点可以实现设计模式的单例模式。单例模式是指创建唯一对象,单例模式设计的类只能实例化一个对象。
class Singleton(object):
__instance=None
def __init__(self):
pass
def __new__(cls, *args, **kwargs):
if Singleton.__instance is None:
Singleton.__instance=object.__new__(cls,*args, **kwargs)
return Singleton.__instance
one=Singleton()
two=Singleton()
print(id(one)) # 2488569943376
print(id(two)) # 2488569943376
print(one == two) # True
print(one is two) # True
原文:https://www.cnblogs.com/SR-Program/p/14061438.html