初识单例模式

单例模式

单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类始终只有一个实例存在

我们都知道,每一次实例化一个对象,它们之间都是独立的。但有些应用场景:比如,全局就希望有一个实体存在,作为配置项等,也就是希望牵一发而动全身。

单例模式正好能解决。

单例模式实现一:__new__

class Singleton:
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:    # 如果实例不存在
            cls._instance = super(Singleton,cls).__new__(cls,*args,**kwargs)   
        return cls._instance     # 否则直接返回 cls._instance

class Myclass(Singleton):
    pass

mc1 = Myclass()
mc2 = Myclass()
print(id(mc1),id(mc2))

>>>2316670072480 2316670072480 # 看,共用一个实例对象

单例模式实现二:模块

重点:模块只导入一次。因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。

因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

mysingleton.py

class My_Singleton(object):
    def foo(self):
        print("foo")


my_singleton = My_Singleton()  # 实例化一个对象

单例模式.py

from mysingleton import my_singleton  # 导入模块中的实例对象
print(id(my_singleton))

from mysingleton import my_singleton 
print(id(my_singleton))

>>>2688065271400     #  共用一个实例对象
   2688065271400    

区分:

from mysingleton import My_Singleton   # 导入模块中的

mc1 = My_Singleton()
mc2 = My_Singleton()

print(id(mc1))
print(id(mc2))

前面导入模块的是一个实例对象,那这次导入的一个类,它们是否是一样的呢?

答案:不一样!看清楚,前面,我们导入是一个实例对象,因为模块导入的特殊性,我们都是共用的一个实例对象。而这次导入的是,这样每次实例化时,都是独立的。

原文地址:https://www.cnblogs.com/ykgo/p/9437781.html