python中__getattribute__與__getattr__調用時的區別

"__getattribute__"方法小結:

     1. 任何調用類的屬性行爲都將從"__getattribute__"開始調用。

     2. 在"__getattribute__"中調用該函數自身屬性,將會導致無限循環,應該借用object對象再調用其本身。所以如果要在自定義類中重寫"__getattribute__"方法,首先該自定

         義類必須繼承object對象,然後借用object對象再調用其本身返回屬性值:  return object.__getattribute__(self, name),如果直接調用__getattribute__(self, name)則會

        無限遞歸

         以如下兩個例子來說明:

          --------------------ex1:--------------------

          class User(object):       #   必須繼承object

                    def __init__(self):

                           self.Id = 0                   

                     def def __getattribute__(self, name):
                           print  'get   '+name
                           return object.__getattribute__(self, name)      # 正常返回屬性值    --借用object對象再調用其本身

 

           u=User()

           u.Id = 1

           print u.Id     

 

          ---------輸出  

             'get  Id '

             '1'

 

          ----------------------------ex2:---------------------------

          class User(object):       #   必須繼承object

                    def __init__(self):

                           self.Id = 0                   

                     def def __getattribute__(self, name):
                           print  'get   '+name
                           return self.__getattribute__(self, name)      #  陷入無限遞歸   

           u=User()

           u.Id = 1

           print u.Id     

 

          ---------輸出  

             'get __getattribute__'

             'get __getattribute__'

             'get __getattribute__'

              'get __getattribute__'    . . .. . . . . . .. ..

 

 

 

"__getattr__"方法小結:

    1. "__getattr__"將會在尋找不到合適的函數或者屬性時作爲默認被調用到。

 

               class User(object):       #   必須繼承object

                    def __init__(self):

                           self.Id = 0                   

                     def def __getattribute__(self, name):
                           print  'get   '+name
                           return object.__getattribute__(self, name)         

                    def def __getattr__(self, name):
                           print  'getattr  '+name
                           return self.__dict__.get(name)

           u=User()

           print u.Id2  

 

          ---------輸出  

             'get  Id2'

             'getattr  Id2'

             None

 

發佈了19 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章