将类限制为最多一个实例时要抛出哪个Python异常?

时间:2013-12-08 16:12:42

标签: python exception singleton

应该使用哪个内置的Python异常来表示我的类的实例(例如MCWindow)已经创建了?它会遵循这样的事情:

window = MCWindow()
try:
    aWindow = MCWindow()
except DontMakeAnotherOneOfTheseInstancesException:
    print("Whoops") # Always the best way to handle exceptions :)

单例模式在这里可能更合适,但我仍然想知道这种情况是否存在内置异常。

3 个答案:

答案 0 :(得分:1)

单身模式在python中并不常见。通常,使用模块而不是对象实例。

换句话说,没有准确的内置异常。创建自己的,或切换到模块。

注意:使用一些元编程可以创建一个类,当实例化时,它总是返回相同的对象,不涉及异常。

答案 1 :(得分:1)

实际上你可以做一点调整

# python object singleton

class Observer():
    pass
observe = Observer()

class singleton():          
    def __init__(self,):            
        if observe.__dict__.has_key(self.__class__.__name__):
            raise Exception, 'Only one instance of the same "%s" class is allowed' % self.__class__.__name__
        observe.__dict__[self.__class__.__name__]=True
    def some_method(self,):
        # roll your own code
        pass


one = singleton()        
two = singleton()     # will raise an error

观察者类是存储状态的地方,而单例类是请求中的类,您只想将其限制为一个实例,您可以创建许多类,如singleton,但是只有一个Observer来保持所有这些状态。

尝试上面的代码,玩得开心......它适合我:))


更新 - 创建单例而不引发异常

class Observer():  

    def __init__(self,):     
        self.error = None

    def __setattr__(self,class_name,instance):
        if not self.__dict__.has_key(instance.__class__.__name__):          
            self.__dict__[class_name]=instance
        else:
            self.error =  'You are only allowed to creat intance once'

    def __getattr__(self,class_name):
        if self.__dict__.has_key(class_name):
            return self.__dict__[class_name]
        else:
            return None

这是你的类被实例化为singleton

class test():
    pass

用法

observe = Observer()  

observe.test = test() # This will be created and bound to the variable
observe.test = test() # This will not be created nor bound, but will generate an error msg in observe.error

if not observe.error:
    print 'created successfully'
else:
    print 'Encountered a problem: %s, only this instance has been created: %s' % (observe.error,observe.test)

答案 2 :(得分:0)

我不这么认为。 您可能可以使用RuntimeError或您自己的继承异常。 Here您可以找到所有内置异常及其说明的列表。

虽然如你所说,谷歌搜索“python singleton”会给你更好的解决方案。