python父类子类变量访问不一致

 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。

教训:
       在父类中已经定义过的变量,子类就不要再次定义了,否则会出现一些很奇怪的问题。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页