《流暢的Python》第十章學(xué)習(xí)筆記

本文的文字及圖片來(lái)源于網(wǎng)絡(luò),僅供學(xué)習(xí)、交流使用,不具有任何商業(yè)用途,,版權(quán)歸原作者所有愕提,如有問(wèn)題請(qǐng)及時(shí)聯(lián)系我們以作處理

作者:測(cè)試游記?? 來(lái)源:推酷

本文鏈接:https://mp.weixin.qq.com/s?__biz=MzU5NTI3NDcxOA==&mid=2247485037&idx=1&sn=c95320355

想要獲取更多Python學(xué)習(xí)資料涕蜂,了解更多關(guān)于Python的知識(shí)华匾,可以加Q群630390733踴躍發(fā)言,大家一起來(lái)學(xué)習(xí)討論吧机隙!

把協(xié)議當(dāng)作正式接口

repr

reprlib.repr用于生成大型結(jié)構(gòu)或遞歸結(jié)構(gòu)的安全表示形式蜘拉。

它會(huì)限制輸出字符串的長(zhǎng)度萨西,用「…」表示截?cái)嗟牟糠帧?/p>

注意:調(diào)用__repr__函數(shù)的目的是調(diào)試,因此絕對(duì)不能拋出異常旭旭,盡量輸出有用的內(nèi)容谎脯,讓用戶(hù)能夠識(shí)別目標(biāo)對(duì)象。

協(xié)議

在面向?qū)ο缶幊讨心瑓f(xié)議是非正式的接口穿肄,只在文檔中定義年局,在代碼中不定義际看。

協(xié)議是非正式的,沒(méi)有強(qiáng)制力矢否,因此如果知道類(lèi)的具體使用場(chǎng)景仲闽,通常只需要實(shí)現(xiàn)一個(gè)協(xié)議的部分。

切片原理

class A:

? ? def __getitem__(self, item):

? ? ? ? return item

if __name__ == '__main__':

? ? a = A()

? ? print(a[1])? # 1

? ? print(a[1:4])? # slice(1, 4, None)

? ? print(a[1:4:2])? # slice(1, 4, 2)

? ? print(a[1:4:2, 9])? # (slice(1, 4, 2), 9)

? ? print(a[1:4:2, 7:9])? # (slice(1, 4, 2), slice(7, 9, None))

slice是內(nèi)置的類(lèi)型僵朗,它的indices方法開(kāi)放了內(nèi)置序列實(shí)現(xiàn)的邏輯赖欣,用于優(yōu)雅的處理缺失索引和負(fù)數(shù)索引,以及長(zhǎng)度超過(guò)目標(biāo)序列的切片验庙。

classslice(start,stop[,step])

返回一個(gè)表示由range(start, stop, step)所指定索引集的 slice 對(duì)象顶吮。其中startstep參數(shù)默認(rèn)為None。切片對(duì)象具有僅會(huì)返回對(duì)應(yīng)參數(shù)值(或其默認(rèn)值)的只讀數(shù)據(jù)屬性start,stop和step粪薛。它們沒(méi)有其他的顯式功能悴了;不過(guò)它們會(huì)被 NumPy 以及其他第三方擴(kuò)展所使用。切片對(duì)象也會(huì)在使用擴(kuò)展索引語(yǔ)法時(shí)被生成违寿。例如:a[start:stop:step]或a[start:stop, i]湃交。

# [:10:2]? [0:5:2]

slice(None, 10, 2).indices(5) # (0, 5, 2)

# [-3::]? [2:5:1]

slice(-3, None, None).indices(5) # (2, 5, 1)

?

indices

獲取實(shí)例所屬類(lèi)

通過(guò)type(self)可以拿到實(shí)例所屬的類(lèi)

動(dòng)態(tài)存取屬性

屬性查找失敗后,解釋器會(huì)調(diào)用__getattr__方法藤巢。

示例代碼

# -*- coding: utf-8 -*-

# @Time? ? : 2020/12/27 下午3:07

# @Author? : zhongxin

# @Email? : 490336534@qq.com

# @File? ? : vector.py

import itertools

import numbers

import functools

import operator

from array import array

import reprlib

import math

class Vector:

? ? typecode = 'd'? # 類(lèi)屬性

? ? shortcut_names = 'xyzt'

? ? def __init__(self, components):

? ? ? ? self._components = array(self.typecode, components)

? ? def __iter__(self):

? ? ? ? return iter(self._components)

? ? def __repr__(self):

? ? ? ? components = reprlib.repr(self._components)

? ? ? ? components = components[components.find('['):-1]

? ? ? ? return f'Vector({components})'

? ? def __str__(self):

? ? ? ? return str(tuple(self))

? ? def __bytes__(self):

? ? ? ? return (bytes([ord(self.typecode)]) + bytes(self._components))

? ? def __eq__(self, other):

? ? ? ? # if len(self) != len(other):

? ? ? ? #? ? return False

? ? ? ? # for a, b in zip(self, other):

? ? ? ? #? ? if a != b:

? ? ? ? #? ? ? ? return False

? ? ? ? # return True

? ? ? ? return len(self) == len(other) and all(a == b for a, b in zip(self, other))

? ? def __hash__(self):

? ? ? ? # hashes = (hash(x) for x in self._components)

? ? ? ? hashes = map(hash, self._components)

? ? ? ? return functools.reduce(operator.xor, hashes, 0)

? ? def __abs__(self):

? ? ? ? return math.sqrt(sum(x * x for x in self))

? ? def __bool__(self):

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

? ? def __len__(self):

? ? ? ? return len(self._components)

? ? def __getitem__(self, item):

? ? ? ? cls = type(self)? # 獲取實(shí)例所屬類(lèi)

? ? ? ? if isinstance(item, slice):

? ? ? ? ? ? return cls(self._components[item])

? ? ? ? elif isinstance(item, numbers.Integral):

? ? ? ? ? ? return self._components[item]

? ? ? ? else:

? ? ? ? ? ? msg = '{cls.__name__} 切片必須是整數(shù)'

? ? ? ? ? ? raise TypeError(msg.format(cls=cls))

? ? def __getattr__(self, name):

? ? ? ? cls = type(self)

? ? ? ? if len(name) == 1:

? ? ? ? ? ? pos = cls.shortcut_names.find(name)

? ? ? ? ? ? if 0 <= pos < len(self._components):

? ? ? ? ? ? ? ? return self._components[pos]

? ? ? ? msg = '{.__name__!r} object has no attribute {!r}'

? ? ? ? raise AttributeError(msg.format(cls, name))

? ? def __setattr__(self, name, value):

? ? ? ? cls = type(self)

? ? ? ? if len(name) == 1:

? ? ? ? ? ? if name in cls.shortcut_names:

? ? ? ? ? ? ? ? error = 'readonly attribute {attr_name!r}'

? ? ? ? ? ? elif name.islower():

? ? ? ? ? ? ? ? error = "can't set attributes 'a' to 'z' in {cls_name!r}"

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? error = ''

? ? ? ? ? ? if error:

? ? ? ? ? ? ? ? msg = error.format(cls_name=cls.__name__, attr_name=name)

? ? ? ? ? ? ? ? raise AttributeError(msg)

? ? ? ? super().__setattr__(name, value)

? ? def angle(self, n):

? ? ? ? r = math.sqrt(sum(x * x for x in self[n:]))

? ? ? ? a = math.atan2(r, self[n - 1])

? ? ? ? if (n == len(self) - 1) and (self[-1] < 0):

? ? ? ? ? ? return math.pi * 2 - a

? ? ? ? else:

? ? ? ? ? ? return a

? ? def angles(self):

? ? ? ? return (self.angle(n) for n in range(1, len(self)))

? ? def __format__(self, format_spec=''):

? ? ? ? if format_spec.endswith('h'):

? ? ? ? ? ? format_spec = format_spec[:-1]

? ? ? ? ? ? coords = itertools.chain([abs(self)], self.angles())

? ? ? ? ? ? outer_fmt = '<{}>'

? ? ? ? else:

? ? ? ? ? ? coords = self

? ? ? ? ? ? outer_fmt = '({})'

? ? ? ? components = (format(c, format_spec) for c in coords)

? ? ? ? return outer_fmt.format(','.join(components))

? ? @classmethod

? ? def frombytes(cls, octets):

? ? ? ? typecode = chr(octets[0])

? ? ? ? memv = memoryview(octets[1:]).cast(typecode)

? ? ? ? return cls(memv)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搞莺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掂咒,更是在濱河造成了極大的恐慌才沧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍刮,死亡現(xiàn)場(chǎng)離奇詭異温圆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)录淡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)捌木,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人嫉戚,你說(shuō)我怎么就攤上這事刨裆〕喝Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵帆啃,是天一觀的道長(zhǎng)瞬女。 經(jīng)常有香客問(wèn)我,道長(zhǎng)努潘,這世上最難降的妖魔是什么诽偷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮疯坤,結(jié)果婚禮上报慕,老公的妹妹穿的比我還像新娘。我一直安慰自己压怠,他們只是感情好眠冈,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著菌瘫,像睡著了一般蜗顽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雨让,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天雇盖,我揣著相機(jī)與錄音,去河邊找鬼栖忠。 笑死崔挖,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的娃闲。 我是一名探鬼主播虚汛,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼皇帮!你這毒婦竟也來(lái)了卷哩?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤属拾,失蹤者是張志新(化名)和其女友劉穎将谊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體渐白,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡尊浓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纯衍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栋齿。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓦堵,到底是詐尸還是另有隱情基协,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布菇用,位于F島的核電站澜驮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏惋鸥。R本人自食惡果不足惜杂穷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卦绣。 院中可真熱鬧耐量,春花似錦、人聲如沸迎卤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蜗搔。三九已至,卻和暖如春八堡,著一層夾襖步出監(jiān)牢的瞬間樟凄,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工兄渺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缝龄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓挂谍,卻偏偏與公主長(zhǎng)得像叔壤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子口叙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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