《Python進階程式設計》學習心得——第二&三章
第二章、一切皆對象
理論
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL90TUZNXOxIGa0JDWoJlMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2ADO0IzMwEjMzEzMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
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