python手撸单例模式
时间: 2023-08-15 14:10:25 浏览: 117
单例模式
在Python中,可以使用装饰器或元类来手动实现单例模式。下面是分别使用装饰器和元类实现单例模式的示例代码:
1. 使用装饰器实现单例模式:
```python
def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
@singleton
class SingletonClass:
def __init__(self, name):
self.name = name
# 使用示例
a = SingletonClass("Instance A")
b = SingletonClass("Instance B")
print(a.name) # 输出:Instance A
print(b.name) # 输出:Instance A
print(a is b) # 输出:True
```
在上述示例中,`singleton` 是一个装饰器函数,它接受一个类作为参数,并返回一个包装函数 `wrapper`。`wrapper` 函数会判断该类是否已经有实例存在,如果不存在,则创建一个新的实例并保存在 `instances` 字典中,然后返回该实例。如果已经存在实例,则直接返回已有的实例。
2. 使用元类实现单例模式:
```python
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class SingletonClass(metaclass=SingletonMeta):
def __init__(self, name):
self.name = name
# 使用示例
a = SingletonClass("Instance A")
b = SingletonClass("Instance B")
print(a.name) # 输出:Instance A
print(b.name) # 输出:Instance A
print(a is b) # 输出:True
```
在上述示例中,`SingletonMeta` 是一个元类,它继承自 `type`。通过在 `SingletonClass` 类中指定 `metaclass=SingletonMeta`,可以将 `SingletonMeta` 设置为该类的元类。在元类的 `__call__` 方法中,判断是否已经存在该类的实例,如果不存在,则创建一个新的实例并保存在 `_instances` 字典中,然后返回该实例。如果已经存在实例,则直接返回已有的实例。
以上是使用装饰器和元类两种常见的手动实现单例模式的方法。这些方法可以确保只有一个实例存在,并提供了全局访问点来获取该实例。
希望这个示例对你有所帮助!如果还有其他问题,请随时提问。
阅读全文