首页 > 解决方案 > 如果我不调用 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 语言编写的,我不愿意深入研究并弄清楚它。

标签: pythonpython-3.x

解决方案


这有点奇怪。在这两种方法中都BaseException实现了and和 set 。大多数类只实现一个或另一个。你只 overrode ,所以仍然收到参数。__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)

推荐阅读