互锁(仅启用一个相同类型的对象)

时间:2014-07-11 11:50:23

标签: python python-2.7

这是我的任务: 我需要实例化同一个类的一些对象。但是只有一个对象可以同时处于活动状态(可能是访问硬件)。因此,我需要在课堂上加入一些联锁。我试过这个,如下例所示。

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 来实现这一点。是否可以在类或对象中管理它?)

1 个答案:

答案 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块中引发异常,模块也将始终停用。