详解Python 模拟实现单子

  • Post category:Python

Python 模拟实现单例设计模式可以通过多种方式实现,下面我将介绍其中两种常用方式。

使用__new__方法实现单例模式

Python 通过类的构造方法 __new__ 实现单例模式,因为默认情况下,__new__ 方法将会返回一个新对象,但是如果我们重写了这个方法,则可以通过控制对象的创建行为,使其无法重复创建新的实例。

class Singleton(object):
    _instance = None
    def __new__(cls):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()
print(id(obj1))
print(id(obj2))

上面是一个使用__new__方法实现的单例模式的示例,这里创建的两个对象 obj1 和 obj2 具有相同的引用地址,说明它们是同一个实例。

使用装饰器实现单例模式

另一种实现单例模式的方式是使用装饰器。由于 Python 语言的特性,可以将装饰器函数作用于类上,从而实现对其构造方法的拦截和处理。

def singleton(cls, *args, **kw):
    instances = {}
    def get_instance():
        if cls not in instances:
            instances[cls] = cls(*args, **kw)
        return instances[cls]
    return get_instance

@singleton
class MyClass:
    def __init__(self, name):
        self.name = name

a = MyClass("Test1")
b = MyClass("Test2")
print(a.name)
print(b.name)
print(id(a))
print(id(b))

上面是使用装饰器实现单例模式的代码示例。通过 @singleton 修饰符,将 MyClass 类处理为单例模式。在此基础上,我们创建了两个 MyClass 对象,即 a 和 b,它们具有相同的引用地址,说明它们是同一个实例。