Python单例模式的实现方法

在面向对象编程中,单例模式是一种设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点让程序可以访问该实例。在Python中,实现单例模式有多种方式,以下是其中两种常见的实现方法:

1.使用函数装饰器实现

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



@singleton
class SingletonClass:
    pass

2.使用类装饰器实现 

class Singleton():
    def __init__(self,cls):
        self._cls = cls()
        self._instances = {}
    
    def __call__(self):
        if self._cls not in self._instance:
            self._instance[self._cls] = self._cls
        return self._instance[self._cls]

@Singleton
class Cls2():
    def __init__(self):
        pass

cls1 = Cls2()
cls2 = Cls2()
print(id(cls1) == id(cls2))

3.使用__new__方式实现

class MyClass():
    _instance = None

    def __new__(cls, *args, **kw):
        if cls._instance is None:
            cls._instance =super().__new__(cls, *args, **kw)
        return cls._instance

    def __init__(self):
        pass


single1 = MyClass()
single2 = MyClass()
print(id(single1) == id(single2))

4.补充:

__new__ 方法:

  • __new__ 是一个在对象实例创建之前被调用的特殊方法,意思就是,在实例化一个类的时候,__init__ 是在__new__ 方法后出现的。比如obj1=MyClass(),这里造了一个空对象,而造这个空对象就是调用__new__ 方法完成的。
  • 它是一个类方法(类方法的第一个参数是类本身,通常命名为 cls),负责创建并返回实例对象。它是一个静态方法,因此需要显式声明 cls 参数,并在调用时传递类引用。
  • __new__ 主要用于实现自定义的对象创建逻辑,例如,可以在每次创建实例之前对实例进行定制或者在对象池中查找并重用现有的实例。
class MyClass:
    def __new__(cls, *args, **kwargs):
        instance = super(MyClass, cls).__new__(cls)
        # 在这里可以添加自定义的创建逻辑
        return instance

    def __init__(self, *args, **kwargs):
        # __init__ 是实例创建之后调用的方法
        pass

__call__ 方法:

  • __call__ 是一个在对象实例被调用时触发的特殊方法。
  • 它允许类的实例像函数一样被调用,通过在类中定义 __call__ 方法,可以使对象实例具有可调用的行为。
  • __call__ 的典型用途是创建可调用的类实例,实例化后可以像函数一样直接调用。
class CallableClass:
    def __call__(self, *args, **kwargs):
        print("Instance is called with arguments:", args, kwargs)

# 创建一个可调用的实例
obj = CallableClass()
obj(1, 2, key="value")  # 输出:Instance is called with arguments: (1, 2) {'key': 'value'}

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值