Python单例模式的四种实现方式详解

巷口听风
巷口听风
发布时间:2026-10-14 | 6人浏览过
原创

本文详细解析Python中实现单例模式的四种常见方法。通过多次实例化指向同一对象的原理,分别介绍了基于类方法、装饰器、元类以及模块级变量的具体代码实现。每种方式均附带完整示例,帮助开发者根据实际需求选择最合适的单例实现方案。

Python单例模式概述

本文介绍了Python中单例模式的具体代码实现,供读者参考学习。

单例模式的核心特征是多次创建实例时,所有引用均指向内存中的同一个实例对象。

在Python中,实现单例模式主要有以下几种常见方式。

基于类方法的单例实现

第一种实现方式是利用类方法控制实例创建。


import settings

class MySQL:
  __instance = None

  def __init__(self, ip, port):
    self.ip = ip
    self.port = port

  @classmethod
  def from_conf(cls):
    if cls.__instance is None:
      cls.__instance = cls(settings.IP,settings.PORT)
    return cls.__instance

obj1 = MySQL.from_conf()
obj2 = MySQL.from_conf()
obj3 = MySQL.from_conf()
print(obj1)
print(obj2)
print(obj3)

基于装饰器的单例实现

第二种实现方式是通过装饰器函数包裹类。


import settings

def singleton(cls):
  _instance = cls(settings.IP, settings.PORT)

  def wrapper(*args, **kwargs):
    if args or kwargs:
      obj = cls(*args, **kwargs)
      return obj
    return _instance

  return wrapper

@singleton
class MySQL:
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port

obj1 = MySQL()
obj2 = MySQL()
obj3 = MySQL()
print(obj1)
print(obj2)
print(obj3)

基于元类的单例实现

第三种实现方式是利用自定义元类来控制类的实例化过程。


import settings

class Mymeta(type):
  def __init__(self, class_name, class_bases, class_dic):
    self.__instance = self(settings.IP, settings.PORT)

  def __call__(self, *args, **kwargs):
    if args or kwargs:
      obj = self.__new__(self)
      self.__init__(obj, *args, **kwargs)
      return obj
    else:
      return self.__instance

class MySQL(metaclass=Mymeta):
  def __init__(self, ip, port):
    self.ip = ip
    self.port = port

obj1 = MySQL()
obj2 = MySQL()
obj3 = MySQL()
print(obj1)
print(obj2)
print(obj3)

基于模块变量的单例实现

第四种实现方式是利用模块级变量,利用Python模块加载机制保证唯一实例。


def f1():
  from singleton import instance
  print(instance)

def f2():
  from singleton import instance,MySQL
  print(instance)
  obj = MySQL('1.1.1.1', '3389')
  print(obj)

f1()
f2()


singleton.py文件里内容:
import settings

class MySQL:
  print('run...')

  def __init__(self, ip, port):
    self.ip = ip
    self.port = port

instance = MySQL(settings.IP, settings.PORT)

以上即为Python单例模式的四种主要实现方式,希望对读者理解该设计模式有所帮助。

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表