我一直在网上搜索以了解Exception.__init__(self)
的用户定义异常的用法。
例如:
我有两个用户定义的例外,一个为Exception.__init__(self)
,第二个没有。
class MyFirstError(Exception):
def __init__(self, result):
Exception.__init__(self)
self.result = result
class MySecondError(Exception):
def __init__(self, result):
self.result = result
def test():
try:
raise MyFirstError("__My First Error__")
except MyFirstError as exc:
return exc.result
def test2():
try:
raise MySecondError("__ My Second Error__")
except MySecondError as exc:
return exc.result
if __name__ == "__main__":
print(test())
print(test2())
输出:
__My First Error__
__ My Second Error__
他们两个都在做类似的事情。我不明白其中的区别。
答案 0 :(得分:2)
更正确的语法对于Python3是super().__init__()
或对于Python2是super(MyFirstError, self).__init__()
。
通常在子类中重写__init__()
时需要执行此操作,并且还需要调用基类构造函数。在您的特定情况下,调用没有参数的基本Exception构造函数没有任何好处,因为它没有做任何花哨的事情,但是您可能希望将result
传递给Exception构造函数,这样您就不必保留{{ 1}}属于子类。
示例:
self.result
尽管如此,同样的事情也可以用更短的时间完成:
class MyFirstError(Exception):
def __init__(self, result):
super().__init__(result) # will pass result as an argument to the base Exception class
由于您未实现构造函数,因此将隐式调用base Exception的class MyFirstError(Exception): pass
方法,以实现与上述完全相同的结果。