2013-11-21 149 views
1
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?

現在我創建一個自定義ExceptionE派生自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 = ''

我不太確定爲什麼會發生這種行爲。如果有人能解釋這一點,將不勝感激。

回答

1

您正在使用super錯誤。第一個參數應該是你定義的類,而不是超類。 super(E, self)跳過EException,所以DE的版本都沒有調用E的構造函數。

0
  1. as @ user2357112 said,you're using super function wrong。超級(E)代表E的超級,而不是E本身。

  2. 關於你的代碼,這是一個特殊情況:

    異常是一個內置的類型,它的超類是BaseException,所以當你調用super(例外),這是代理BaseException。

    在Exception的派生類中,當您調用super(E)時是代理Exception類型。

    在BaseException的init方法中,如果只有一個參數傳入,參數賦值給message屬性,如果參數count不等於1,它將不會給message屬性賦值。和異常的初始化只是調用BaseException的init,所以結果相同。

    errorcode始終是當前對象的屬性,所以它總是看起來不錯。

    ,當你調用

超(E,個體經營)。 init(self。錯誤代碼,*一個,**千瓦)

有兩個參數,(-1111, 'ASDF'),所以異常消息是 ''

嘗試:

ë =異常(-1111, 'ASDF')

e.args

e.message

和此:

E =異常(-1111)

e.args

e.message

相關問題