Python实现单例模式的三种常见方式解析

叶初
叶初
发布时间:2026-10-13 | 2人浏览过
原创

本文详细解析Python中实现单例模式的三种主要方法:通过装饰器缓存实例、重写基类__new__方法以及利用元类控制类创建。每种方式均附有代码示例,帮助开发者理解不同场景下的最佳实践与实现细节。

使用装饰器实现单例

第一种实现方式是利用装饰器。

该装饰器内部维护一个名为instances的字典,用于缓存所有被标记为单例的类。当尝试创建单例实例时,若该类在字典中不存在则新建并缓存;若已存在,则直接返回缓存的实例对象。


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 Foo(object):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2

使用基类__new__方法实现

第二种实现方式是基于基类。

__new__方法是Python中真正负责创建实例对象的底层机制。通过重写基类的__new__方法,可以确保在创建对象时仅生成一个实例,后续调用均返回该唯一实例。


class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

使用元类实现单例

第三种实现方式是利用元类。

元类(参考:深刻理解Python中的元类)是用于创建类对象的类。当类对象创建实例时,会调用元类的__call__方法。因此,在元类的__call__方法中控制逻辑,保证始终只创建一个实例即可。type是Python内置的一个元类,可作为参考基础。


class Singleton(type):
def __call__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
cls._instance = super(Singleton, cls).__call__(*args, **kwargs)
return cls._instance
class Foo(object):
__metaclass__ = Singleton
foo1 = Foo()
foo2 = Foo()
print foo1 is foo2 # True

以上介绍了本文的核心内容,希望能为读者提供有益参考,也欢迎大家继续支持本站获取更多技术资讯。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表