day22_单例模式

1、单例模式

​ 属于创建类型的一种常用的软件设计模式。通过单例模式的方法,能够确保创建的类在当前进程中只有一个实例(多线程时需要另作分析)

2、实现单例模式的几种方式

2.1 模块

模块第一次被导入时,会被执行并生成.pyc文件,第二次被导入,就会直接加载.pyc文件,而不会被重复执行

因此,可以将相关的函数和数据定义在一个模块中,即可得到单例对象

2.2 装饰器

# 对象是由类实例化产生,因此装饰器的参数是类,即被装饰的是类
def Singleton(cls):
    _instance = {}  # 存放单例对象,以类名cls为key,cls的实例化对象为value

    def wrapper(*args, **kwargs):
        if cls not in _instance:
            # 不存在类cls的单例对象,实例化一个类cls的对象
            _instance[cls] = cls(*args, *kwargs)
        else:
            # 存在类cls的单例对象,不执行cls的实例化
            pass
        return _instance[cls]  # 注意此处返回的是value,而不是整个_instance

    return wrapper

@Singleton
class Foo:
    def __init__(self, name):
        self.name = name

foo1 = Foo('alex')
foo2 = Foo('tank')
foo3 = Foo('nick')
print(foo1.name)
print(foo2.name)
print(foo3.name)
'''
alex
alex
alex'''

2.3 使用类的绑定方法

使用类的数据属性值存放单例对象????????

class Singleton:
    __instance
    def __init(self,*args,**kwargs):
        pass
    @classmethod
    def singleton(cls,*args,**kwargs):
        if not cls.__instance:
            self.__instance = cls(*args,**kwargs)
        return cls.__instance
obj = Singleton.singleton()          

2.4 基于__new__()方法实现

class Foo:
    _instance = None
    def __new__(cls, *args, **kwargs):
        
        if cls._instance:
            pass
        else:
            cls._instance = super().__new__(cls)
        return cls._instance
    def __init__(self,name,age):
        self.name = name
        self.age = age
foo1 = Foo('alex',18)
foo2 = Foo('tank',19)
print(foo1)
print(foo2)
'''
<__main__.Foo object at 0x000001757F197A48>
<__main__.Foo object at 0x000001757F197A48>'''
posted @ 2019-10-12 21:10  W文敏W  阅读(110)  评论(0编辑  收藏  举报