2013-11-21 97 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

相关问题