fluent Python 讀書筆記(二)

2021-08-19 13:54:24 字數 1195 閱讀 6733

對書中1-2 示例中的筆記

1.我們自定義實現乙個類,如何實現這個類的加法,乘法,模等性質呢?

以二維向量為例。

from math import hypot

class vector:

def __init__(self, x=0, y=0):

self.x = x

self.y = y

def __repr__(self):

return 'vector(%r, %r)' %(self.x, self.y)

def __abs__(self):

return hypot(self.x, self.y)

def __bool__(self):

return bool(abs(self))

def __add__(self, other):

x = self.x + other.x

y = self.y + other.y

return vector(x, y)

def __mul__(self, scalar):

return vector(self.x * scalar, self.y * scalar)

2.首先比較重要的是這個__repr__。它的返回值是我們在讀取這個物件時顯示的一條字串,可以讓我們讀取這個二維向量的資訊。它與__str__的區別在於後者傾向於讀者友好型,前者方便程式設計師。

有了這個方法,可以看到我們接下來的add 和mul都return乙個物件例項,這個物件例項在返回時其實就呼叫了__repr__中的這個返回值,所以我們在+或-時可以將結果易讀地顯示在互動台上。

3. __add__ 和 __mul__其實分別實現的是加法乘法。注意加法的引數other,乘法的引數scalar。加法操作時並未改變self.x(y) 或 other.x(y),而是建立了新的變數,乘法也是如此。這基於算術運算的原則,不改變參與計算的值。

4.bool方法是用來判斷真假的,所以在它的返回值裡我們使用了bool函式來確保返回的是乙個bool值。當物件不存在bool方法時,會呼叫len去判斷,若長度為0則為假,否則為真。我們定義二維向量中模為0為假,否則為真。因此模為0時,呼叫bool會返回false。 python直譯器在遇到if + object 時, 應該會呼叫物件的bool方法。

5.並不是很了解hypot, 等了解後再寫。總之abs是乙個計算絕對值或模的乙個函式。

Fluent Python讀書筆記 二

特殊方法的存在是為了被python直譯器呼叫的,自己並不需要呼叫它。所以使用len object 而不是object.len 如果object是乙個自定義類的物件,python會自己呼叫其中由你實現的 len 方法,而如果是python內建的型別 list,str,bytearray等 cpytho...

Fluent Python讀書筆記 三

容器序列 list tuple和collections.deque這些序列可以存放不同型別的資料。存放的是它們所包含的任意型別的物件的引用。扁平序列 str bytes bytearray memoryview和array.array,這類序列只能容納一種型別。存放的是值而不是引用,扁平序列其實是一...

fluent Python 讀書筆記(五)

今天寫對於 這本書第三章的回顧 1.可雜湊的資料型別 原子不可變資料型別 數值,str 都是可雜湊的 元組只有它所有元素是可雜湊的它才是雜湊的 什麼叫可雜湊的資料型別?1.要能實現hash方法,且每次hash出來的值是一樣的 2.要能實現eq方法,a b為true 時雜湊值也想等 2.建立字典有很多...