Python单例模式的四种实现方式详解
本文详细解析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单例模式的四种主要实现方式,希望对读者理解该设计模式有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













