python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python单例模式实现

Python实现单例模式的最佳方法汇总

作者:1010n111

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例,在Python中,有多种方式可以实现单例模式,不同的实现方式各有优缺点,适用于不同的场景,本文给大家汇总了最佳实现方法,需要的朋友可以参考下

Python中实现单例模式的最佳方法

技术背景

单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。在Python中,有多种方式可以实现单例模式,不同的实现方式各有优缺点,适用于不同的场景。

实现步骤

方法1:使用装饰器

def singleton(class_):
    instances = {}
    def getinstance(*args, **kwargs):
        if class_ not in instances:
            instances[class_] = class_(*args, **kwargs)
        return instances[class_]
    return getinstance

@singleton
class MyClass(BaseClass):
    pass

方法2:使用基类

class Singleton(object):
    _instance = None
    def __new__(class_, *args, **kwargs):
        if not isinstance(class_._instance, class_):
            class_._instance = object.__new__(class_, *args, **kwargs)
        return class_._instance

class MyClass(Singleton, BaseClass):
    pass

方法3:使用元类

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

# Python2
class MyClass(BaseClass):
    __metaclass__ = Singleton

# Python3
class MyClass(BaseClass, metaclass=Singleton):
    pass

方法4:装饰器返回同名类

def singleton(class_):
    class class_w(class_):
        _instance = None
        def __new__(class_, *args, **kwargs):
            if class_w._instance is None:
                class_w._instance = super(class_w,
                                    class_).__new__(class_,
                                                    *args,
                                                    **kwargs)
                class_w._instance._sealed = False
            return class_w._instance
        def __init__(self, *args, **kwargs):
            if self._sealed:
                return
            super(class_w, self).__init__(*args, **kwargs)
            self._sealed = True
    class_w.__name__ = class_.__name__
    return class_w

@singleton
class MyClass(BaseClass):
    pass

方法5:使用模块

将需要作为单例的类和相关属性、方法定义在一个模块中,由于模块只会被导入一次,因此模块中的全局变量和函数可以作为单例使用。

# singleton.py
class MyClass:
    def foo(self):
        pass

my_singleton = MyClass()
# main.py
from singleton import my_singleton
my_singleton.foo()

核心代码

以下是使用元类实现单例模式的代码示例:

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

class Logger(metaclass=Singleton):
    pass

logger1 = Logger()
logger2 = Logger()
print(logger1 is logger2)  # 输出: True

最佳实践

常见问题

以上就是Python实现单例模式的最佳方法汇总的详细内容,更多关于Python单例模式实现的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文