gpt4 book ai didi

python - 如何在 Python 中删除(拆解)单例实例装饰器以进行单元测试?

转载 作者:太空宇宙 更新时间:2023-11-04 06:01:27 26 4
gpt4 key购买 nike

我是 Python 新手。我有一个单例装饰器定义为:

def singleton(cls):
instances = {}

def getinstance():
if cls not in instances:
instances[cls] = cls()
return instances[cls]
return getinstance

还有我的单例类:

@singleton
class MyClass:

def __init__(self, **kwargs):
self.config = None
...

我想为 MyClass 编写一些单元测试,但我需要在 tearDown() 方法上销毁它,以便测试正常运行。我该怎么做?

非常感谢,

最佳答案

我认为可以将问题重新问为“我可以访问闭包外部的闭包变量吗”以清除“instances”指令。

我没有对此进行测试,但这种方法可以在您将实例数据公开为函数属性(基本上使其等于模块级变量)的情况下工作:

def singleton(cls):

def getinstance():
if cls not in singleton.instances:
singleton.instances[cls] = cls()
return singleton.instances[cls]
return getinstance

singleton.instances = {}


# Then clear
def tearDown(self):
singleton.instances = {}

但是我不确定你是否想经历所有的魔法只是为了拥有一个单例。例如。另一种不那么神奇的延迟加载模式可以是:

class MyClass:

@classmethod
def get_instance(cls):
if not hasattr(cls, "_instance"):
cls._instance = cls()
return cls._instance

instance = MyClass.get_instance()

或者在没有延迟加载的情况下更简单:

class MyClass:
...


MyClass.instance = MyClass()

关于python - 如何在 Python 中删除(拆解)单例实例装饰器以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24800880/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com