什么是单例模式?通俗点讲:单例模式就是在程序执行的过程中,类只有一个实例,这不是说单例模式只能去创建一个实例,而是你创建的所有实例(也就是对象)都指的是同一个实例。如何做到这一点呢?我们的__new__特殊方法就派上用场了,可能大家对这个方法熟悉又陌生,那么接下来通过一个小程序简单的过渡一下

class A():
    def __new__(cls):
        return "你好"
    
    def __init__(self):
        print(self)

print(A())

猜想一下,这里控制台会输出什么?

输出结果:你好

这里再创建A对象的时候就会先执行__new__方法,然后将返回值传递给__init__方法的self,所以结果会是:你好,这这段程序中我们知道对象的创建是依靠__new__方法的,那么我们就可以通过这个方法入手,每次创建对象的时候在__new__方法内部进行判断,不拐弯抹角了,直接附上为小伙伴们准备的代码。

class A():
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        print(self)
        
A()    #输出结果:<__main__.A object at 0x0000020CED433FD0>
A()    #输出结果:<__main__.A object at 0x0000020CED433FD0>

此外还有两种实现单例的方式,我呢也给大家列出来,方便大家学习和参考:

# 方式一
def Single(cls,*args,**kwargs):
    instances = {}
    def get_instance (*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return get_instance
@Single
class B:
    pass
    
# 方式二
class Single:
    def __init__(self):
        print("单例模式实现方式二。。。")

single = Single()
del Single  # 每次调用single就可以了

通过测验,可以清晰对比到两个对象地址是一样的,可见我们的目的就达到了,上面三种实现方式
在使用中也略有不同,大家可以根据需要使用。
谢谢大家的支持!


二十一
1.4k 声望867 粉丝

无论遇到多大的困难,你总是能扛过去,坚持一件事,对自己