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 = ''
。
我不太確定爲什麼會發生這種行爲。如果有人能解釋這一點,將不勝感激。