国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-16 00:31:30
字體:
來源:轉載
供稿:網友

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凉城县| 江西省| 泾阳县| 临猗县| 沂水县| 墨竹工卡县| 攀枝花市| 都兰县| 浦县| 朝阳市| 连山| 武穴市| 松江区| 扎兰屯市| 肃宁县| 儋州市| 佛教| 五大连池市| 阜新| 垣曲县| 扬中市| 辛集市| 青浦区| 柳江县| 九龙城区| 白山市| 嘉峪关市| 鲁甸县| 田阳县| 昌图县| 屯昌县| 容城县| 淳化县| 偏关县| 苍山县| 东阿县| 兴业县| 鹤峰县| 桂林市| 大姚县| 子洲县|