这是我的任务: 我需要实例化同一个类的一些对象。但是只有一个对象可以同时处于活动状态(可能是访问硬件)。因此,我需要在课堂上加入一些联锁。我试过这个,如下例所示。
class ModuleClass(object):
_activeModule = None
def __init__(self, aModuleName):
self.ModuleName = aModuleName
def activate_module(self):
if self.__class__._activeModule == None:
self.__class__._activeModule = self.ModuleName
#activate module here
print("%s active"%self.ModuleName)
else:
raise UserWarning, "other module active"
def deactivate_module(self):
if self.__class__._activeModule == self.ModuleName:
self.__class__._activeModule = None
#deactivate module here
print("%s deactivated"%self.ModuleName)
else:
raise UserWarning
在测试运行开始时导入此类,并在测试运行中使用此类的实例。现在的问题是,测试运行可以从任何情况下中止。然后自动重复测试运行。然后我无法激活 ModuleClass 的任何对象,因为 _activeModule 属性未设置为其默认值。
如果重复测试运行,如何才能正确实现此互锁功能? (而且我不想在测试运行中使用 try ... except 来实现这一点。是否可以在类或对象中管理它?)
答案 0 :(得分:0)
将您的激活/停用记录为context manager:
class ModuleClass(object):
_activeModule = None
def __init__(self, aModuleName):
self.name = aModuleName
def __enter__(self):
if ModuleClass._activeModule == None:
ModuleClass._activeModule = self.name
print("%s active" % self.name)
else:
raise UserWarning, "other module active"
def __exit__(self, exc_type, exc_value, traceback):
if ModuleClass._activeModule == self.name:
ModuleClass._activeModule = None
print("%s deactivated" % self.name)
else:
raise UserWarning
在测试代码中使用它:
module = ModuleClass("abc")
with module:
print "using %s" % module.name
输出:
abc active
using abc
abc deactivated
即使在with
块中引发异常,模块也将始终停用。