最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python進(jìn)階之自定義對(duì)象實(shí)現(xiàn)切片功能

 更新時(shí)間:2019年01月07日 11:08:49   作者:豌豆花下貓  
這篇文章主要介紹了Python進(jìn)階之自定義對(duì)象實(shí)現(xiàn)切片功能,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

切片是 Python 中最迷人最強(qiáng)大最 Amazing 的語(yǔ)言特性(幾乎沒(méi)有之一),在《Python進(jìn)階:切片的誤區(qū)與高級(jí)用法》中,我介紹了切片的基礎(chǔ)用法、高級(jí)用法以及一些使用誤區(qū)。這些內(nèi)容都是基于原生的序列類(lèi)型(如字符串、列表、元組......),那么,我們是否可以定義自己的序列類(lèi)型并讓它支持切片語(yǔ)法呢?更進(jìn)一步,我們是否可以自定義其它對(duì)象(如字典)并讓它支持切片呢?

1、魔術(shù)方法:__getitem__()

想要使自定義對(duì)象支持切片語(yǔ)法并不難,只需要在定義類(lèi)的時(shí)候給它實(shí)現(xiàn)魔術(shù)方法 __getitem__() 即可。所以,這里就先介紹一下這個(gè)方法。

語(yǔ)法: object.__getitem__(self, key)

官方文檔釋義:Called to implement evaluation of self[key]. For sequence types, the accepted keys should be integers and slice objects. Note that the special interpretation of negative indexes (if the class wishes to emulate a sequence type) is up to the __getitem__() method. If key is of an inappropriate type, TypeError may be raised; if of a value outside the set of indexes for the sequence (after any special interpretation of negative values), IndexError should be raised. For mapping types, if key is missing (not in the container), KeyError should be raised.

概括翻譯一下:__getitem__() 方法用于返回參數(shù) key 所對(duì)應(yīng)的值,這個(gè) key 可以是整型數(shù)值和切片對(duì)象,并且支持負(fù)數(shù)索引;如果 key 不是以上兩種類(lèi)型,就會(huì)拋 TypeError;如果索引越界,會(huì)拋 IndexError ;如果定義的是映射類(lèi)型,當(dāng) key 參數(shù)不是其對(duì)象的鍵值時(shí),則會(huì)拋 KeyError 。

2、自定義序列實(shí)現(xiàn)切片功能

接下來(lái),我們定義一個(gè)簡(jiǎn)單的 MyList ,并給它加上切片功能。(PS:僅作演示,不保證其它功能的完備性)。

class MyList():
 def __init__(self):
  self.data = []
 def append(self, item):
  self.data.append(item)
 def __getitem__(self, key):
  print("key is : " + str(key))
  return self.data[key]

l = MyList()
l.append("My")
l.append("name")
l.append("is")
l.append("Python貓")

print(l[3])
print(l[:2])
print(l['hi'])

### 輸出結(jié)果:
key is : 3
Python貓
key is : slice(None, 2, None)
['My', 'name']
key is : hi
Traceback (most recent call last):
...
TypeError: list indices must be integers or slices, not str

從輸出結(jié)果來(lái)看,自定義的 MyList 既支持按索引查找,也支持切片操作,這正是我們的目的。

特別需要說(shuō)明的是,此例中的 __getitem__() 方法會(huì)根據(jù)不同的參數(shù)類(lèi)型而實(shí)現(xiàn)不同的功能(取索引位值或切片值),也會(huì)妥當(dāng)?shù)靥幚懋惓?,所以并不需要我們?cè)偃?xiě)繁瑣的處理邏輯。網(wǎng)上有不少學(xué)習(xí)資料完全是在誤人子弟,它們會(huì)教你區(qū)分參數(shù)的不同類(lèi)型,然后寫(xiě)一大段代碼來(lái)實(shí)現(xiàn)索引查找和切片語(yǔ)法,簡(jiǎn)直是畫(huà)蛇添足。下面的就是一個(gè)代表性的錯(cuò)誤示例:

###略去其它代碼####
def __getitem__(self, index):
 cls = type(self)
 if isinstance(index, slice): # 如果index是個(gè)切片類(lèi)型,則構(gòu)造新實(shí)例
  return cls(self._components[index])
 elif isinstance(index, numbers.Integral): # 如果index是個(gè)數(shù),則直接返回
  return self._components[index]
 else:
  msg = "{cls.__name__} indices must be integers"
  raise TypeError(msg.format(cls=cls))

3、自定義字典實(shí)現(xiàn)切片功能

切片是序列類(lèi)型的特性,所以在上例中,我們不需要寫(xiě)切片的具體實(shí)現(xiàn)邏輯。但是,對(duì)于其它非序列類(lèi)型的自定義對(duì)象,就得自己實(shí)現(xiàn)切片邏輯。以自定義字典為例(PS:僅作演示,不保證其它功能的完備性):

class MyDict():
 def __init__(self):
  self.data = {}
 def __len__(self):
  return len(self.data)
 def append(self, item):
  self.data[len(self)] = item
 def __getitem__(self, key):
  if isinstance(key, int):
   return self.data[key]
  if isinstance(key, slice):
   slicedkeys = list(self.data.keys())[key]
   return {k: self.data[k] for k in slicedkeys}
  else:
   raise TypeError

d = MyDict()
d.append("My")
d.append("name")
d.append("is")
d.append("Python貓")
print(d[2])
print(d[:2])
print(d[-4:-2])
print(d['hi'])

### 輸出結(jié)果:
is
{0: 'My', 1: 'name'}
{0: 'My', 1: 'name'}
Traceback (most recent call last):
...
TypeError

上例的關(guān)鍵點(diǎn)在于將字典的鍵值取出,并對(duì)鍵值的列表做切片處理,其妙處在于,不用擔(dān)心索引越界和負(fù)數(shù)索引,將字典切片轉(zhuǎn)換成了字典鍵值的切片,最終實(shí)現(xiàn)目的。

4、小結(jié)

最后小結(jié)一下:本文介紹了__getitem__() 魔術(shù)方法,并用于實(shí)現(xiàn)自定義對(duì)象(以列表類(lèi)型和字典類(lèi)型為例)的切片功能,希望對(duì)你有所幫助。也希望大家多多支持腳本之家。

相關(guān)文章

  • 由淺入深講解python中的yield與generator

    由淺入深講解python中的yield與generator

    這篇文章主要由淺入深講解了python中yield與generator的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-04-04
  • 使用python 獲取進(jìn)程pid號(hào)的方法

    使用python 獲取進(jìn)程pid號(hào)的方法

    這篇文章主要介紹了使用python 獲取進(jìn)程pid號(hào)的方法,需要的朋友可以參考下
    2014-03-03
  • pytorch DataLoaderj基本使用方法詳解

    pytorch DataLoaderj基本使用方法詳解

    這篇文章主要為大家介紹了pytorch DataLoaderj基本使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例

    python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了python 平衡二叉樹(shù)實(shí)現(xiàn)代碼示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • python線(xiàn)程池的四種好處總結(jié)

    python線(xiàn)程池的四種好處總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python線(xiàn)程池的四種好處歸納內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-04-04
  • Python中requests庫(kù)的基本概念與具體使用方法

    Python中requests庫(kù)的基本概念與具體使用方法

    requests庫(kù)是用python編寫(xiě)的基于urllib,requests唯一的一個(gè)非轉(zhuǎn)基因的Python HTTP庫(kù),下面這篇文章主要給大家介紹了關(guān)于Python中requests庫(kù)的基本概念與具體使用方法,需要的朋友可以參考下
    2022-08-08
  • 初步介紹Python中的pydoc模塊和distutils模塊

    初步介紹Python中的pydoc模塊和distutils模塊

    這篇文章主要介紹了Python中的pydoc模塊和distutils模塊,本文來(lái)自于IBM官方開(kāi)發(fā)者技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • python中pyqtgraph知識(shí)點(diǎn)總結(jié)

    python中pyqtgraph知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python中pyqtgraph知識(shí)點(diǎn)總結(jié)內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-01-01
  • Python文件的讀寫(xiě)和異常代碼示例

    Python文件的讀寫(xiě)和異常代碼示例

    這篇文章主要介紹了Python文件的讀寫(xiě)和異常代碼示例,首先分享了文件讀寫(xiě)的簡(jiǎn)單方法,然后略為詳細(xì)地介紹了Python異常的相關(guān)內(nèi)容,不足之處,歡迎補(bǔ)充。
    2017-10-10
  • python 函數(shù)中的參數(shù)類(lèi)型

    python 函數(shù)中的參數(shù)類(lèi)型

    thon中函數(shù)的參數(shù)類(lèi)型比較豐富,比如我們經(jīng)常見(jiàn)到*args和**kwargs作為參數(shù)。今天給大家介紹python 函數(shù)中的參數(shù)類(lèi)型,需要的朋友可以參考下
    2020-02-02

最新評(píng)論

汝州市| 盖州市| 称多县| 栾城县| 成都市| 余庆县| 铁岭市| 绥滨县| 威宁| 安平县| 大名县| 三江| 日喀则市| 田林县| 永福县| 来安县| 迁西县| 武功县| 潜山县| 鄂托克前旗| 西宁市| 琼结县| 麻城市| 收藏| 嘉兴市| 剑川县| 金坛市| 罗江县| 白河县| 连云港市| 梁河县| 吉木乃县| 巴楚县| 梨树县| 城口县| 探索| 鸡泽县| 乌拉特前旗| 方城县| 平顶山市| 和龙市|