特殊方法的存在是為了被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.建立字典有很多...