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
俗话说,不会编程的音乐人不是一名好厨师,不会弹钢琴的运动员不是一位好画家,所以我成为了一名会理发的小瓦匠!
本文详细介绍了Python中实现单例模式的三种方法:通过元类、重写__new__方法和使用装饰器。单例模式确保类仅有一个实例,并全局访问。文章提供了具体的代码示例,展示了如何使用这些方法来创建单例类。
2025

被折叠的 条评论
为什么被折叠?



