欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

語法: 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 所對應(yīng)的值,這個 key 可以是整型數(shù)值和切片對象,并且支持負數(shù)索引;如果 key 不是以上兩種類型,就會拋 TypeError;如果索引越界,會拋 IndexError ;如果定義的是映射類型,當(dāng) key 參數(shù)不是其對象的鍵值時,則會拋 KeyError 。

2、自定義序列實現(xià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é)果來看,自定義的 MyList 既支持按索引查找,也支持切片操作,這正是我們的目的。

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

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

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

切片是序列類型的特性,所以在上例中,我們不需要寫切片的具體實現(xiàn)邏輯。但是,對于其它非序列類型的自定義對象,就得自己實現(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)鍵點在于將字典的鍵值取出,并對鍵值的列表做切片處理,其妙處在于,不用擔(dān)心索引越界和負數(shù)索引,將字典切片轉(zhuǎn)換成了字典鍵值的切片,最終實現(xiàn)目的。

4、小結(jié)

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

相關(guān)文章

  • 簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程

    簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程

    這篇文章主要介紹了簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程,使用yield生成器函數(shù)進行多進程編程是Python學(xué)習(xí)進階當(dāng)中的重要知識,需要的朋友可以參考下
    2015-05-05
  • python3圖片文件批量重命名處理

    python3圖片文件批量重命名處理

    這篇文章主要為大家詳細介紹了Python3圖片文件批量重命名處理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 使用Python進行時間序列分析的8種繪圖類型

    使用Python進行時間序列分析的8種繪圖類型

    時間序列數(shù)據(jù)是按時間順序按固定時間間隔排列的觀測值的集合,每個觀察對應(yīng)于一個特定的時間點,并且可以以各種頻率(例如,每天、每月、每年)記錄數(shù)據(jù),本文介紹了幾種類型的繪圖,可幫助您使用 Python 進行時間序列分析,并提供使用可免費訪問的數(shù)據(jù)集的詳細示例
    2023-09-09
  • Python3標準庫之functools管理函數(shù)的工具詳解

    Python3標準庫之functools管理函數(shù)的工具詳解

    functools模塊提供的主要工具就是partial類,可以用來“包裝”一個有默認參數(shù)的callable對象。這篇文章主要介紹了Python3標準庫functools管理函數(shù)的工具的實例詳解,需要的朋友可以參考下
    2020-02-02
  • 關(guān)于numpy.array的shape屬性理解

    關(guān)于numpy.array的shape屬性理解

    這篇文章主要介紹了關(guān)于numpy.array的shape屬性理解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Python的高級Git庫 Gittle

    Python的高級Git庫 Gittle

    Gittle是一個高級純python git 庫。構(gòu)建在dulwich之上,提供了大部分的低層機制
    2014-09-09
  • Python調(diào)用百度根據(jù)經(jīng)緯度查詢地址的示例代碼

    Python調(diào)用百度根據(jù)經(jīng)緯度查詢地址的示例代碼

    今天小編就為大家分享一篇Python調(diào)用百度根據(jù)經(jīng)緯度查詢地址的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Pyhton中防止SQL注入的方法

    Pyhton中防止SQL注入的方法

    這篇文章主要介紹了Pyhton中防止SQL注入的方法,本文講解的方法簡單實用,需要的朋友可以參考下
    2015-02-02
  • Python實現(xiàn)按中文排序的方法示例

    Python實現(xiàn)按中文排序的方法示例

    這篇文章主要介紹了Python實現(xiàn)按中文排序的方法,涉及Python基于locale模塊的中文編碼與排序相關(guān)操作技巧,需要的朋友可以參考下
    2018-04-04
  • python運行腳本文件的三種方法實例

    python運行腳本文件的三種方法實例

    在計算中,腳本一詞用于指代包含訂單邏輯序列的文件或批處理文件,下面這篇文章主要給大家介紹了關(guān)于python運行腳本文件的三種方法,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06

最新評論