如果我不调用super().__init__(),自定义异常类的父级如何获取参数?

假设我创建了一个像这样的自定义异常类:

class MyError(Exception):
    def __init__(self, msg):
        pass

raise MyError('this is an error')

# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# __main__.MyError: this is an error

MyError类不叫super().__init__(),所以我没有看到任何方式对父类,了解该错误消息('this is an error')。尽管如此,此代码仍能正常工作:错误消息确实存储在对象中的某处,并在我引发异常时打印出来。

如何以及为什么这样做?如果我__init__()在子类中重写并且不调用super().__init__(). 我试图找到 Exception 类的 Python 代码,但它看起来像是用 C 语言编写的,我不愿意深入研究并弄清楚它。

回答

这有点奇怪。BaseException实现, 并在这两种方法中设置。大多数类只实现其中一个。您只是覆盖了,因此仍然会收到参数。__new__ __init__self.args__init____new__

如果您覆盖__new__并阻止参数到达BaseException.__new__,您会发现消息丢失了:

class MyError(Exception):
    def __init__(self, msg):
        pass
    def __new__(cls, msg):
        return super().__new__(cls)


以上是如果我不调用super().__init__(),自定义异常类的父级如何获取参数?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>