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

Python進階之自定義對象實現切片功能

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

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

1、魔術方法:__getitem__()

想要使自定義對象支持切片語法并不難,只需要在定義類的時候給它實現魔術方法 __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__() 方法用于返回參數 key 所對應的值,這個 key 可以是整型數值和切片對象,并且支持負數索引;如果 key 不是以上兩種類型,就會拋 TypeError;如果索引越界,會拋 IndexError ;如果定義的是映射類型,當 key 參數不是其對象的鍵值時,則會拋 KeyError 。

2、自定義序列實現切片功能

接下來,我們定義一個簡單的 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'])

### 輸出結果:
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

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

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

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

3、自定義字典實現切片功能

切片是序列類型的特性,所以在上例中,我們不需要寫切片的具體實現邏輯。但是,對于其它非序列類型的自定義對象,就得自己實現切片邏輯。以自定義字典為例(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'])

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

上例的關鍵點在于將字典的鍵值取出,并對鍵值的列表做切片處理,其妙處在于,不用擔心索引越界和負數索引,將字典切片轉換成了字典鍵值的切片,最終實現目的。

4、小結

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

相關文章

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

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

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

    使用python 獲取進程pid號的方法

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

    pytorch DataLoaderj基本使用方法詳解

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

    python 平衡二叉樹實現代碼示例

    這篇文章主要介紹了python 平衡二叉樹實現代碼示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • python線程池的四種好處總結

    python線程池的四種好處總結

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

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

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

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

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

    python中pyqtgraph知識點總結

    在本篇文章里小編給大家整理的是一篇關于python中pyqtgraph知識點總結內容,有興趣的朋友們可以學習下。
    2021-01-01
  • Python文件的讀寫和異常代碼示例

    Python文件的讀寫和異常代碼示例

    這篇文章主要介紹了Python文件的讀寫和異常代碼示例,首先分享了文件讀寫的簡單方法,然后略為詳細地介紹了Python異常的相關內容,不足之處,歡迎補充。
    2017-10-10
  • python 函數中的參數類型

    python 函數中的參數類型

    thon中函數的參數類型比較豐富,比如我們經常見到*args和**kwargs作為參數。今天給大家介紹python 函數中的參數類型,需要的朋友可以參考下
    2020-02-02

最新評論

青海省| 成都市| 赤壁市| 河津市| 隆回县| 南皮县| 桐城市| 凌源市| 靖安县| 伊川县| 宁晋县| 景德镇市| 肇州县| 堆龙德庆县| 青铜峡市| 九江县| 阳山县| 南部县| 葵青区| 黔南| 邯郸市| 墨玉县| 宾川县| 博客| 兴文县| 湖北省| 胶南市| 游戏| 玛曲县| 中宁县| 鲁山县| 三都| 武鸣县| 正镶白旗| 元朗区| 宜都市| 奈曼旗| 忻城县| 敖汉旗| 汝州市| 凤翔县|