在面向对象编程中,单例模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点让程序可以访问该实例。在Python中,实现单例模式有多种方式,以下是其中两种常见的实现方法:
1.使用函数装饰器实现
def singleton(cls):
instances = {}
def get_instance(*args,**kwargs):
if cls not in instances:
instances[cls] = cls(*args,**kwargs)
return instances[cls]
return get_instance
@singleton
class SingletonClass:
pass
2.使用类装饰器实现
class Singleton():
def __init__(self,cls):
self._cls = cls()
self._instances = {}
def __call__(self):
if self._cls not in self._instance:
self._instance[self._cls] = self._cls
return self._instance[self._cls]
@Singleton
class Cls2():
def __init__(self):
pass
cls1 = Cls2()
cls2 = Cls2()
print(id(cls1) == id(cls2))
3.使用__new__方式实现
class MyClass():
_instance = None
def __new__(cls, *args, **kw):
if cls._instance is None:
cls._instance =super().__new__(cls, *args, **kw)
return cls._instance
def __init__(self):
pass
single1 = MyClass()
single2 = MyClass()
print(id(single1) == id(single2))
4.补充:
__new__
方法:
__new__
是一个在对象实例创建之前被调用的特殊方法,意思就是,在实例化一个类的时候,__init__
是在__new__
方法后出现的。比如obj1=MyClass(),这里造了一个空对象,而造这个空对象就是调用__new__
方法完成的。- 它是一个类方法(类方法的第一个参数是类本身,通常命名为
cls
),负责创建并返回实例对象。它是一个静态方法,因此需要显式声明cls
参数,并在调用时传递类引用。 __new__
主要用于实现自定义的对象创建逻辑,例如,可以在每次创建实例之前对实例进行定制或者在对象池中查找并重用现有的实例。
class MyClass:
def __new__(cls, *args, **kwargs):
instance = super(MyClass, cls).__new__(cls)
# 在这里可以添加自定义的创建逻辑
return instance
def __init__(self, *args, **kwargs):
# __init__ 是实例创建之后调用的方法
pass
__call__
方法:
__call__
是一个在对象实例被调用时触发的特殊方法。- 它允许类的实例像函数一样被调用,通过在类中定义
__call__
方法,可以使对象实例具有可调用的行为。 __call__
的典型用途是创建可调用的类实例,实例化后可以像函数一样直接调用。
class CallableClass:
def __call__(self, *args, **kwargs):
print("Instance is called with arguments:", args, kwargs)
# 创建一个可调用的实例
obj = CallableClass()
obj(1, 2, key="value") # 输出:Instance is called with arguments: (1, 2) {'key': 'value'}