Python 2.7.3 (default, Sep 26 2012, 21:53:58)
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> c = Exception("asdf")
>>> c.message
'asdf'
>>> class E(Exception):
... def __init__(self, ec, *args, **kwargs):
... self.errorcode = ec
... super(Exception, self).__init__(*args, **kwargs)
...
>>> e = E(-1, "asdfasdf")
>>> e
E('asdfasdf',)
>>> e.message
'asdfasdf'
>>> e.errorcode
-1
>>> class DE(E):
... def __init__(self, *a, **kw):
... self.errorcode = -1111
... super(E, self).__init__(*a, **kw)
...
>>> d = DE("asdf")
>>> d.errorcode
-1111
>>> d.message
'asdf'
>>> class DE(E):
... def __init__(self, *a, **kw):
... self.errorcode = -1111
... super(E, self).__init__(self.errorcode, *a, **kw)
...
>>> d = DE("asdf")
>>> d.message
''
>>> d.errorcode
-1111
>>>
让我来解释一下上面的代码。 e = Exception("My message")
,将导致e.message="My message"
。如何在下面的代码中将参数传递给super?
现在我创建一个自定义Exception
类E
派生自Exception
类。它有一个额外的位置参数ec
。当我创建E(-1,"some message")
时,E.message="some message"
按预期工作。
现在我创建DE(E)
。现在在调用super时,我只做super(E, self).__init__(*args, **kwargs)
- 请注意,我没有传递错误代码,尽管E
的init期望将错误代码作为第一个参数。在这种情况下的DE("some message")
导致DE.message="some message"
。
接下来,超级调用修改为super(E, self).__init__(self.errorcode, *args, **kwargs)
- >这是E
中的预期签名。完成后,DE("some message")
结果为DE.message = ''
。
我不太确定为什么会发生这种行为。如果有人能解释这一点,将不胜感激。