python 增强的单例模式

2023-03-23  本文已影响0人  圣_狒司机

一、 简单的单例模式

class Singleton:
 __instance = None
 
def __new__(cls):
    if cls.__instance is None:
        cls.__instance = super().__new__(cls)
        return cls.__instance

在不同的包里引用这个类,永远生成同一个实例,这个类也只有这一个实例。

二、 增强的单例模式

class Meta:
    _instances = {}
    def __new__(cls,*args):
        if args[0] in cls._instances:
            return cls._instances[args[0]]
        return super().__new__(cls)
    
    def __init__(self,name,left=None,right=None):
        self.name = name
        self.left = left
        self.right = right
        self._instances[name] = self

    @staticmethod
    def get(s):
        if s not in Meta._instances:
            return Meta(s)
        else:
            return Meta._instances[s]

测试一下:

import pytest
@pytest.fixture(scope="module")
def newclass():
    return Meta

def test_Meta(newclass):
    a = newclass("a")
    b = newclass.get("a")
    assert a == b

def test_Meta_count(newclass):
    c = newclass.get("c")
    assert newclass._instances.__len__() == 2

pytest.main()

2 passed in 0.45s

用类的实例化方法和get方法做了三个实例,因为有两个名字相同,所以只会生成两个实例。无论什么时候只要实例的名字一致,生成的实例都指向同一个,这样实现了用名字进行索引。

上一篇 下一篇

猜你喜欢

热点阅读