class MyException(Exception):
message = _("An unknown exception occurred.")
code =500
headers = {}
safe =False
def__init__(self, message=None):
if not message:
message =self.message
super(MyException,self).__init__(message)
exc = MyException('help')
print exc.message
print super(MyException, exc).message
运行结果为:
An unknown exceptionoccurred.
help
为什么父类与子类的message变量不一样呢?
解答:
通过dir(Exception),可以知道message为Exception的class成员(非instance成员),即在Exception.__dict__中。
In [11]: dir(Exception)
Out[11]:
['__class__',
'__delattr__',
'__dict__',
'__doc__',
'__format__',
'__getattribute__',
'__getitem__',
'__getslice__',
'__hash__',
'__init__',
'__new__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__setstate__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__unicode__',
'args',
'message']
在MyException中,又重新定义了一个message变量。所以在MyException和Exception都分别存放了一个message变量。根据之前的 python对象之属性访问流程介绍,MyException("help")只是初始化了Exception中的message,MyException自己的message并未改变。通过exc.message访问的是MyException的message,通过super(MyException, self).message访问的是Exception的message。
教训:
在父类中已经定义过的变量,子类就不要再次定义了,否则会出现一些很奇怪的问题。