第一章 Python數(shù)據(jù)模型

此筆記用于記錄《流暢的Python》一書的學(xué)習(xí)要點(diǎn)嚼松,與各位Python愛好者分享虾啦,以后每周至少更新兩章內(nèi)容,完全是基于該書的精華總結(jié)同衣,并以此監(jiān)督自己竟块,讓自己在學(xué)習(xí)python的道路一直前進(jìn)!

Python數(shù)據(jù)模型:是對(duì)Python框架的描述耐齐,規(guī)范了這門語言自身構(gòu)建模塊的接口浪秘,這些模塊包括但不限于序列、迭代器埠况、函數(shù)耸携、類和上下文管理器。(個(gè)人認(rèn)為辕翰,python的數(shù)據(jù)模型其實(shí)就是構(gòu)成我們程序猿使用的諸如序列夺衍、迭代器、函數(shù)喜命、類等框架的底層實(shí)現(xiàn)沟沙,供框架本身調(diào)用。)

python中含有大量的特殊方法(__X__)壁榕,這些特殊函數(shù)我們稱之為魔術(shù)方法或者雙下方法矛紫。在做基礎(chǔ)對(duì)象操作的時(shí)候,解釋器可能背后調(diào)用的可能就是一些特殊方法牌里。比如:obj[key]調(diào)用__getitem__方法颊咬。my_collection[key]==my_collection.__getitem__(key)。

通過一個(gè)撲克牌的例子來看看python重載特殊函數(shù)的強(qiáng)大之處:

import collections

from randomimport choice

Card = collections.namedtuple('card', ['rank', 'suit']) ? #namedtuple用來創(chuàng)建只有少量屬性,沒有方法的對(duì)象

#撲克牌類喳篇,通過該類實(shí)例化的對(duì)象擁有其他一般類型一樣的屬性敞临。

class FrenchDeck:

? ? ranks = [str(n)for nin range(2, 11)] +list('JQKA')

? ? suit ='spades diamonds clubs hearts'.split()

? ? def __init__(self):

? ? ? ? self._cards = [Card(rank, suit)for rankin self.ranksfor suitin self.suit] ? ?#_cards是一個(gè)list

? ? def __len__(self):

? ? ? ? return len(self._cards) ? 返回紙牌的總數(shù)

? ? def __getitem__(self, item):

? ? ? ? return self._cards[item] ? 返回某一張紙牌對(duì)象


>>>deck = FrenchDeck()

>>>len(deck) ? #返回52

>>>deck[0] ? #返回Card(rank='2', suit='spades')?

通過特殊方法的例子,我們知道了重載的特殊函數(shù)之后的強(qiáng)大之處麸澜⊥δ颍總結(jié)一下,特殊方法怎么使用痰憎?首先票髓,特殊方法是被python解釋器調(diào)用的,我們一般不會(huì)顯式調(diào)用铣耘,也就是一般不會(huì)my_obj.__len__()洽沟,而應(yīng)該是len(my_obj),如果自己沒有實(shí)現(xiàn)特殊函數(shù)蜗细,python回去調(diào)用默認(rèn)的特殊函數(shù)裆操。也就是說,特殊方法的調(diào)用是隱式的炉媒。


此外踪区,利用特殊方法,可以讓自定義的對(duì)象(比如類實(shí)例)通過加號(hào)"+"進(jìn)行運(yùn)算吊骤。下面我們定義一個(gè)二維向量缎岗,實(shí)現(xiàn)二維向量的運(yùn)算符計(jì)算。

from mathimport hypot

class Vector():

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

? ? ? ? self.x = x

? ? ? ? self.y = y

#把對(duì)象以字符串的形式表達(dá)出來白粉。__str__在str()被調(diào)用或者print()被調(diào)用的時(shí)候才被調(diào)用传泊。如果沒有實(shí)現(xiàn)__str__,但是實(shí)現(xiàn)了__repr__鸭巴,那么眷细,print()打印自定義對(duì)象時(shí),調(diào)用__repr__鹃祖。

? ? def __repr__(self):

? ? ? ? return 'Vector({!r}, {!r})'.format(self.x, self.y)

? ? def __str__(self):

? ? ? ? return 'vector({!r}, {!r})'.format(self.x, self.y)

#求直角三角形斜邊長

? ? def __abs__(self):

? ? ? ? return hypot(self.x, self.y)

#判斷向量是否為真

? ? def __bool__(self):

? ? ? ? return bool(abs(self))

#兩個(gè)向量相加

? ? 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)

#向量的長度

? ? def __len__(self):

? ? ? ? return self.x +self.y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末溪椎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子恬口,更是在濱河造成了極大的恐慌校读,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祖能,死亡現(xiàn)場(chǎng)離奇詭異地熄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)芯杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揭厚,你說我怎么就攤上這事却特。” “怎么了筛圆?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵裂明,是天一觀的道長。 經(jīng)常有香客問我太援,道長闽晦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任提岔,我火速辦了婚禮仙蛉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘碱蒙。我一直安慰自己荠瘪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布赛惩。 她就那樣靜靜地躺著哀墓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪喷兼。 梳的紋絲不亂的頭發(fā)上篮绰,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音季惯,去河邊找鬼吠各。 笑死,一個(gè)胖子當(dāng)著我的面吹牛星瘾,可吹牛的內(nèi)容都是我干的走孽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼琳状,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼磕瓷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起念逞,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤困食,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后翎承,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硕盹,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年叨咖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘩例。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啊胶。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖垛贤,靈堂內(nèi)的尸體忽然破棺而出焰坪,到底是詐尸還是另有隱情,我是刑警寧澤聘惦,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布某饰,位于F島的核電站,受9級(jí)特大地震影響善绎,放射性物質(zhì)發(fā)生泄漏黔漂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一禀酱、第九天 我趴在偏房一處隱蔽的房頂上張望炬守。 院中可真熱鬧,春花似錦比勉、人聲如沸劳较。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽观蜗。三九已至,卻和暖如春衣洁,著一層夾襖步出監(jiān)牢的瞬間墓捻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工坊夫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砖第,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓环凿,卻偏偏與公主長得像梧兼,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子智听,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容