2013-12-08 25 views
2

哪些内置的Python异常应该用于表示我的类的实例(例如MCWindow)已经创建?它会遵循这样的事情:将类限制为最多一个实例时抛出哪个Python异常?

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

的单例模式很可能会更适合这里,但我还是想知道是否有这种情况下的内置异常。

+0

没有内置异常这一点,因为这是一个不做/信号的有用或有意义的事情,因为这样的限制,通常是没有意义的,当它是不是有更好的方法执行它。 **为什么**你必须强制只创建一个实例? – delnan

+0

RuntimeError用于“当检测到不属于任何其他类别的错误时”,这是最适合的内置异常。但是使用自定义异常可能更好,或者不像其他人提到的那样使用单例。 – RemcoGerlich

+0

@SimonT,检查我的答案 – securecurve

回答

1

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

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

注意:可能会使用一些元编程来创建一个类,该类在实例化时总是返回相同的对象,不会涉及任何异常。

+0

我不确定为我的'MCWindow'使用模块是否适合我的情况,但对于未来的项目来说这是一个很好的建议。用Python进行元编程有点超出我的范围,但谢谢。 – SimonT

+0

@uʍopǝpısdn,我已经做了一些调整,而不需要元编程,查看我的答案在这个页面 – securecurve

0

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

虽然,正如你所说,为“python singleton”搜索google会给你许多更好的解决方案。

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 

这是你的类被实例化为单身人士

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) 
+0

欣赏在这里帮助实现单例模式的努力。但是,我不认为引用'Exception'是最好的选择,因为它会使得处理异常更加困难,因为编码器必须捕获所有的Exception,然后找出问题所在。 – SimonT

+0

@SimonT,检查我的最后更新,创建一个单例,但不会引发异常。请告知我是否有帮助 – securecurve

+0

我相信您的代码值得赞扬。然而,因为我的问题是关于内置Python异常,而不是关于Singleton模式,我真的不能给予其他功劳。不过,我会充分利用您的解决方案。 – SimonT

相关问题