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。

教訓:
       在父類中已經定義過的變量,子類就不要再次定義了,否則會出現一些很奇怪的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章