python 2.x中class Exception
的签名是什么?
我希望对它进行子类化并添加我自己的参数,同时也正确地调用super
。
以下代码有效:
class FooError(Exception):
def __init__(self, msg, x):
super(FooError, self).__init__(msg)
self.x = x
答案 0 :(得分:2)
你有什么好的。可替换地,
class FooError(Exception):
def __init__(self, msg, x):
Exception.__init__(self, msg)
self.x = x
来自docs:
派生类中的重写方法实际上可能需要扩展 而不是简单地替换同名的基类方法。 有一种简单的方法可以直接调用基类方法:只是 调用BaseClassName.methodname(self,arguments)。这有时是偶然的 对客户也很有用。 (请注意,这只适用于基础 class可以作为全局范围内的BaseClassName访问。)
答案 1 :(得分:1)
这部分Python文档在方法签名方面并不十分明确,但有一些提示。
引用Python文档(6.内置异常):
......除非另有说明,否则它们会显示“相关值” 错误的详细原因。这可能是字符串或元组 包含几项信息......
BaseException指出以下内容:
ARGS
赋予异常构造函数的参数元组。
和例外:
在版本2.5中更改:已更改为从BaseException继承。
其他信息只能在来源中找到(我认为)
static int
BaseException_init(PyBaseExceptionObject *self, PyObject *args, PyObject *kwds) {
if (!_PyArg_NoKeywords(Py_TYPE(self)->tp_name, kwds))
return -1;
Py_DECREF(self->args);
self->args = args;
Py_INCREF(self->args);
if (PyTuple_GET_SIZE(self->args) == 1) {
Py_CLEAR(self->message);
self->message = PyTuple_GET_ITEM(self->args, 0);
Py_INCREF(self->message);
}
return 0;
}
如您所见,它不允许使用关键字参数。 args 在 new 中初始化为元组。
所有签名都是:
def __init__ ( self, *args )
继承自Exception(不限制参数)
class FooError ( Exception ):
def __init__ ( self, x, *args ):
Exception.__init__ ( self, *args )
self.x = x
我总是明确地调用基类,我不喜欢 super 。但这只是一个风格问题。
请注意您的代码是正确的。您只需将 Exception 限制为只接收一个参数,而它可以处理元组。
答案 2 :(得分:0)
我认为异常的__init__()
是这样的:
def __init__(self, obj):
# do something
但我在Python的网站上找不到文档。这只能通过阅读Python的源代码来确认。