python3中的单例模式
单例模式:即确保某个类只有一个实例,且能够自行实例化并向系统提供这个实例,这个类称为单例类。单例中无论创建几个实例对象,都是对同一个内存对象操作。
python实现单例模式的方式:
元类、 带有__new__的普通类、 利用@装饰器。
元类
class Singleton(type):
# 元类构造继承type
def __init__(self, name, bases, attrs):
super(Singleton, self).__init__(name, bases, attrs)
self.instance = None
def __call__(self, *args, **kwargs):
if not self.instance:
self.instance = super(Singleton, self).__call__(*args, **kwargs)
return self.instance
class Mysingle(metaclass=Singleton):
pass
a = Mysingle()
b = Mysingle()
a.name = 'Apple'
print(id(a))
print(id(b))
print(a.name)
print(b.name)
# 单例模式中创建的实例id都应该相等
# 运行后结果
# print(id(a))
2156407246576
# print(id(b))
2156407246576
# print(a.name)
Apple
# print(b.name)
Apple
__new__的 普通类
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, 'instance'):
cls.instance = super().__init__(cls, *args, **kwargs)
return cls.instance
a = Singleton()
b = Singleton()
print(id(a))
print(id(b))
# 运行结果
#print(id(a))
1872012432
#print(id(a))
1872012432
@装饰器
import functools
def singleton(cls):
instance = {}
@functools.wraps(cls)
def wrapper(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return wrapper
@singleton
class Mysingleton(object):
pass
a = Mysingleton()
b = Mysingleton()
print(id(a) == id(b))
# 运行结果
# print(id(a) == id(b))
True
俗话说,不会编程的音乐人不是一名好厨师,不会弹钢琴的运动员不是一位好画家,所以我成为了一名会理发的小瓦匠!