一、 简单的单例模式
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方法做了三个实例,因为有两个名字相同,所以只会生成两个实例。无论什么时候只要实例的名字一致,生成的实例都指向同一个,这样实现了用名字进行索引。









网友评论