天天看點

《Python進階程式設計》學習心得——第二&三章《Python進階程式設計》學習心得——第二&三章

《Python進階程式設計》學習心得——第二&三章

第二章、一切皆對象

理論

《Python進階程式設計》學習心得——第二&三章《Python進階程式設計》學習心得——第二&三章

Python中一切皆對象,上圖給出了根本性的闡釋。具體而言,對象有id,類型,和值三大要素。不妨與Java對比分析Python“一切皆對象”的設計理念:

  • 與Java一樣,Python中的類也都是繼承于同一個基類。在Java中,這個基類是Object,而在Python中,這個基類是object[1]
  • 與Java不同的是,Python裡對象的類型(即Python内置類型或程式員用class關鍵字定義的類)也是對象,這些對象是type類的執行個體[2]
  • 那麼我們來考查type,根據[1],type類繼承object類;根據[2],object和type都是type類的執行個體,是以type對象是type類的執行個體。

綜上,正是通過type類和type對象自己執行個體化自己的回環,Python實作了“一切皆對象”。

代碼

這一章用的Python文法有:

  • 類.__bases__傳回類的父類元組(可能有多重繼承)
  • type(對象)傳回對象的類型

下面是一些例子

>>> type(list)
<class 'type'>
>>> list.__bases__
(<class 'object'>,)
>>> type(object)
<class 'type'>
>>> object.__bases__
()
>>> type(type)
<class 'type'>
>>> type.__bases__
(<class 'object'>,)
           

第三章、魔法函數

魔法函數沒有特别抽象的理論,是以就直接上代碼和例子吧。

dir(類)會傳回類的所有屬性和方法,比如dir(object)會看到一些魔法函數

dir(object)
Out[1]: 
['__class__',
 '__delattr__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__gt__',
 '__hash__',
 '__init__',
 '__init_subclass__',
 '__le__',
 '__lt__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__']
           

舉例來說,__eq__, __ge__, __gt__是比較運算,__repr__和__str__決定了對象的輸出方式。

下面以__len__和__str__為例講解魔法函數的使用。

  • __len__:如果一個類實作了__len__方法用于計算對象的長度,則可以用len(該類的對象)來獲得該類對象的長度(當然也可以用 該類對象.__len__()來計算,兩者是等價的)
    class A:
        def __init__(self, a=(1,2,3)):
            self.content = a
            
        def __len__(self):
            return len(self.content)
        
    
    a = A((1,3,4,5))
    
    len(a)
    Out[6]: 4
    
    a.__len__()
    Out[7]: 4
               
  • __str__:類似Java裡重寫toString方法,Python裡的print(對象)語句實際上會執行print(對象.__str__())
    class Point:
        def __init__(self, x, y):
            self.x = x
            self.y = y
            
        def __str__(self):
            return 'x:{}, y:{}'.format(self.x, self.y)
        
    
    p = Point(1, 3)
    
    print(p)
    x:1, y:3	
            
    print(p.__str__())
    x:1, y:3