python 实现单例模的n种思路简说

为什么要实现单例模式

  • 节省内存

实现的思路

  • new
  • 装饰器
  • 模块引用
  • 元类

实现思路

new方式

class SingleTon:
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            cls._instance = super().__new__(cls)
        return super(SingleTon, cls).__new__(cls)

    def __init__(self, name):
        self.name = name

python 实现单例模的n种思路简说_第1张图片
image.png
  • 优 好象优势也不是那么明显
  • 劣 重写了new

装饰器

def singleton(cls, *args, **kwargs):
    _instance = {}

    def _singleton():
        if cls not in _instance:
            _instance[cls] = cls(*args, **kwargs)
        return _instance
    return _singleton

import time


@singleton
class Test:
    
    def __init__(self):

        time.sleep(0.1)
        print("23")


for i in range(10):
    t = Test()
    print(t.name)

优: 灵活
劣:把类的属性变成一个方法返回

模块引用

其实Python的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。

元类

class SingleClass:

    def __new__(cls, *args, **kwargs):
        if hasattr(cls, "_instance"):
            cls._instance = super().__new__(cls)
        return super(SingleClass, cls).__new__(cls)


class Class_1:
    __metaclass__ = SingleClass

    def __init__(self):
        print("re")


for i in range(12):
    print(Class_1())

参考:
https://mp.weixin.qq.com/s/9Jy0nEb1VHYmzhIeBxIx1A

https://www.jianshu.com/p/cddbf26261e3

你可能感兴趣的:(python 实现单例模的n种思路简说)