Fluent Python讀書筆記 二

2021-08-10 08:10:55 字數 1540 閱讀 4953

特殊方法的存在是為了被python直譯器呼叫的,自己並不需要呼叫它。(所以使用len(object),而不是object.__len__())

如果object是乙個自定義類的物件,python會自己呼叫其中由你實現的__len__()方法,而如果是python內建的型別(list, str, bytearray等),cpython會抄個近路,__len__()實際上會直接返回pyvarobject裡的ob_size屬性。

很多時候,特殊方法的呼叫時隱式的,for i in x:用的是iter(x)

from math import hypot

class

vector:

def__init__

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

self.x=x

self.y=y

'''__repr__將乙個物件用字串的形式表達出來以便辨認

%r用rper()方法處理物件

%s用str()方法處理物件

%r列印時能夠重現它所代表的物件 如:

>>> text = "i am %d years old." % 22

>>> print "i said: %r." % text

i said: 'i am 22 years old.'. // %r 給字串加了單引號

>>> import datetime

>>> d = datetime.date.today()

>>> print "%r" % d

datetime.date(2017, 11, 5)

'''def__repr__

(self):

return

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

# __abs__返回輸入值的絕對值

def__abs__

(self):

return hypot(self.x,self.y)

# bool(x)的背後是呼叫x.__bool__()的結果;如果不存在__bool__方法,那麼bool(x)就會嘗試呼叫__len__(),若返回0,bool會返回false

def__bool__

(self):

return bool(abs(self))

'''def __bool__(self):

return bool(self.x or self.y)

更高效'''

# __add__和__mul__方法返回值都是新建立的向量物件,中綴運算子的基本原則就是不改變操作物件,而是產出乙個新的值

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)

Fluent Python讀書筆記 三

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

fluent Python 讀書筆記(二)

對書中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 retur...

fluent Python 讀書筆記(五)

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