01-數(shù)據(jù)模型

1. 數(shù)據(jù)模型:其實是對 Python 框架的描述噪伊,它規(guī)范了這門語言自身構(gòu)建模塊

的接口囚戚,這些模塊包括但不限于序列窿锉、迭代器酌摇、函數(shù)、類和上下文管理器嗡载。

Python 解釋器碰到特殊的句法時窑多,會使用特殊方法去激活一些基本的對象操作,這些特殊方法的名字以兩個下

劃線開頭洼滚,以兩個下劃線結(jié)尾埂息;

這些特殊方法名能讓你自己的對象實現(xiàn)和支持以下的語言構(gòu)架,并與之交互:

* 迭代

* 集合類

* 屬性訪問

* 運算符重載

* 函數(shù)和方法的調(diào)用

* 對象的創(chuàng)建和銷毀

* 字符串表示形式和格式化

* 管理上下文(即 with 塊)

案例:

import collections

'''

collections.namedtuple用以構(gòu)建只有少數(shù)屬性但是沒有方法的對象;

命名元組為元組中的每個位置賦予意義,并允許使用更可讀的自文檔化代碼千康。它們可以在使用

常規(guī)元組的任何地方使用享幽,并且它們添加了按名稱而不是位置索引訪問字段的能力。

返回名為typename的新元組子類吧秕。新的子類用于創(chuàng)建類元組的對象琉闪,這些對象具有可通過屬性查找訪問的字段以及可索引和可iterable迹炼。

'''

Card=collections.namedtuple('Card',['rank','suit'])

beer_card = Card('7', 'diamonds')

例:

# 定義撲克類

class FrenchDeck:

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

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

? ? def __init__(self):

? ? ? ? self._cards = [Card(rank, suit) for suit in self.suits

? ? ? ? for rank in self.ranks]

? ? def __len__(self):

? ? ? ? return len(self._cards)

? ? def __getitem__(self, position):

? ? ? ? return self._cards[position]

# 從一疊牌中抽取特定的一張紙牌

# __getitem__ 方法把 [] 操作交給了 self._cards 列表

# 用 len() 函數(shù)來查看一疊牌有多少張:

deck = FrenchDeck()

len(deck)

# Python 內(nèi)置了從一個序列中隨機選出一個元素的函數(shù) random.choice

from random import choice

t=choice(deck)

# 實現(xiàn)了 __getitem__ 方法砸彬,這一摞牌就變成可迭代的了

for c in deck:

? ? print(c)

# 反向迭代, doctest: +ELLIPSIS 過長的內(nèi)容就會被如上面例子的最后一行的省略號(...)所替代

for card in reversed(deck):# doctest: +ELLIPSIS

? ? print(card)

# 一個集合類型沒有實現(xiàn) __contains__ 方法,那么 in 運算符就會按順序做一次迭代搜索斯入。

Card('Q', 'hearts') in deck

例:

# 按照常規(guī)砂碉,用點數(shù)來判定撲克牌的大小,2 最小刻两、A

# 最大增蹭;同時還要加上對花色的判定,黑桃最大磅摹、紅桃次之滋迈、方塊再次、梅花最小户誓。

suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)

def spades_high(card):

? ? rank_value = FrenchDeck.ranks.index(card.rank)

? ? return rank_value * len(suit_values) + suit_values[card.suit]

# 有了 spades_high 函數(shù)饼灿,就能對這摞牌進行升序排序了

for card in sorted(deck, key=spades_high): # doctest: +ELLIPSIS

? ? print(card)

2 重寫符號

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)

調(diào)用

v1 = Vector(2, 4)

v2 = Vector(2, 1)

v1+v2

v = Vector(3, 4)

abs(v)

例:字符串函數(shù)

內(nèi)置的函數(shù)叫 repr,它能把一個對象用字符串的形式表達出來以便辨認帝美,這就是“字符串表示形式”

# __repr__ 和 __str__ 的區(qū)別在于碍彭,后者是在 str() 函數(shù)被使用,或是在用 print 函數(shù)打印一個對象的時候才被調(diào)用的悼潭,并且它返回的字

# 符串對終端用戶更友好庇忌。

class Tea:

? ? def __repr__(self):

? ? ? ? return "我是一個repr"

#? ? def __str__(self):

#? ? ? ? return "我是一個str"

t=Tea()

print(t)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舰褪,隨后出現(xiàn)的幾起案子皆疹,更是在濱河造成了極大的恐慌,老刑警劉巖占拍,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件略就,死亡現(xiàn)場離奇詭異,居然都是意外死亡刷喜,警方通過查閱死者的電腦和手機残制,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來掖疮,“玉大人初茶,你說我怎么就攤上這事。” “怎么了恼布?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵螺戳,是天一觀的道長。 經(jīng)常有香客問我折汞,道長倔幼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任爽待,我火速辦了婚禮损同,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸟款。我一直安慰自己膏燃,他們只是感情好,可當我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布何什。 她就那樣靜靜地躺著组哩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪处渣。 梳的紋絲不亂的頭發(fā)上伶贰,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音罐栈,去河邊找鬼黍衙。 笑死,一個胖子當著我的面吹牛悠瞬,可吹牛的內(nèi)容都是我干的们豌。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼浅妆,長吁一口氣:“原來是場噩夢啊……” “哼望迎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起凌外,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤辩尊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后康辑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摄欲,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年疮薇,在試婚紗的時候發(fā)現(xiàn)自己被綠了胸墙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡按咒,死狀恐怖迟隅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤智袭,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布奔缠,位于F島的核電站,受9級特大地震影響吼野,放射性物質(zhì)發(fā)生泄漏校哎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一瞳步、第九天 我趴在偏房一處隱蔽的房頂上張望闷哆。 院中可真熱鬧,春花似錦谚攒、人聲如沸阳准。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讼稚,卻和暖如春括儒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锐想。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工帮寻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赠摇。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓固逗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親藕帜。 傳聞我的和親對象是個殘疾皇子烫罩,可洞房花燭夜當晚...
    茶點故事閱讀 45,870評論 2 361

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