1. 程式人生 > >《Think Python》第15章學習筆記

《Think Python》第15章學習筆記

用戶 main asa ... 類名 執行 __main__ deb 5.4

《Think Python》第15章學習筆記

[TOC]

15.1 程序員定義的類型(Programmer-defined types)

定義一個類的過程會創建一個類型對象(type object)。比如,我們創建一個點(Point)類:

>>> class Point:
...     """
...     Represents a point in 2-D spaces.
...     """
... 
>>> type(Point)
<class 'type'>
>>> Point <class '__main__.Point'>

因為點(Point)類定義在最高層,因此,它的“全名”(full name)是 __main__.Point

一個類型對象(type object)就像一個“生產”對象的工廠,調用某一個類的類名,就可以創建該類的對象。調用的返回值是一個引用(reference),該引用指向該類的對象。比如,我們創建一個 Point 類的對象,則它的返回值是一個指向 Point 類對象的引用,同時我們將這個引用賦值給 blank 這個變量。

>>> blank = Point()
>>>
blank <__main__.Point object at 0x100ef2c50>

生成一個新對象的過程稱為實例化(instantiation),生成的對象稱為該類的一個實例(instance)

15.2 屬性(Attributes)

15.3 矩形(Rectangles)

15.4 對象作為返回值(Instances as return values)

15.5 對象是可變的(Objects are mutable)

15.6 復制(Copying)

在 Python 中,is 運算符判斷的是兩個引用是否指向同一個對象(即引用相等),而 == 運算符判斷的是兩個對象是否相等(即值相等)

。這一點與 Java 恰好相反,在 Java 中,== 運算符判斷的是引用相等,而值相等則是通過 equals 方法進行判斷的。

但是,在 Python 中,對於用戶自定義的類,== 運算符與 is 運算符實現的功能是一樣的,都是檢查對象的引用是否相等。

# Case 1
>>> l1 = ['I', 'Love', 'Python']
>>> l2 = l1
>>> l1 is l2
True
>>> l1 == l2
True
>>> id(l1)
4502865672
>>> id(l2)
4502865672

# Case2
>>> l1 = ['a', 'b']
>>> l2 = ['a', 'b']
>>> l1 is l2
False
>>> l1 == l2
True
>>> id(l1)
4502885192
>>> id(l2)
4502885128

當你調用 copy 模塊的 copy 方法復制對象時,實際上只是執行淺復制(shallow copy),即 copy 方法只會復制該對象以及它包含的引用,而不包含引用所指向的對象。copy 模塊的另一個方法 deepcopy 則不只是復制對象以及對象包含的引用,同時也會復制引用所指向的對象,這樣操作稱為深復制(deep copy)

15.7 調試(Debugging)

可以用內建函數 isinstance 來檢查一個對象是否為某個類的實例。

>>> isinstance(p, Point)
True

可以用內建函數 hasattr 來檢查一個對象是否含有某個特定的屬性(attribute)。

>>> hasattr(p, 'x')
True

除了可以使用 hasattr 方法,也可以使用 try 語句。

try:
    x = p.x
except AttributeError:
    x = 0

《Think Python》第15章學習筆記