Python中实现单例模式
在Python中实现单例模式,有多种方式,下面列举其中的三种常见方式。
使用装饰器实现单例模式:
def singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance @singleton class MyClass: def __init__(self): pass
在这个例子中,我们使用装饰器 singleton 来将 MyClass 转换成单例模式。装饰器 singleton 接受一个类 cls 作为参数,然后返回一个新的函数 getinstance。getinstance 函数会检查是否已经创建过 cls 类的实例,如果没有,则创建一个新的实例并返回,否则返回已经创建的实例。
使用元类实现单例模式:
class Singleton(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class MyClass(metaclass=Singleton): def __init__(self): pass
在这个例子中,我们定义了一个元类 Singleton,它继承自 type 类。元类 Singleton 实现了 call 方法,当我们创建一个新的类 MyClass 时,Python 会调用元类 Singleton 的 call 方法来实例化 MyClass。在 call 方法中,我们检查是否已经创建过 MyClass 的实例,如果没有,则创建一个新的实例并返回,否则返回已经创建的实例。
使用模块实现单例模式:
class MyClass: def __init__(self): pass my_singleton = MyClass()
在这个例子中,我们创建一个模块级别的变量 my_singleton,它是一个 MyClass 的实例。由于模块在 Python 中只会被导入一次,因此 my_singleton 只会被创建一次,从而实现了单例模式。
下面以第一种方式为例,演示如何在Python中实现单例模式:
def singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance @singleton class MySingleton: def __init__(self): self.name = "pidancode.com" print(MySingleton().name) # 输出:pidancode.com print(MySingleton().name) # 输出:pidancode.com print(MySingleton().name) # 输出:pidancode.com
在上面的代码中,我们定义了一个类 MySingleton,并使用装饰器 singleton 将其转换为单例模式。然后我们创建了三个 MySingleton 类的实例,但是它们都是同一个实例,因此输出
相关文章