之前寫(xiě)到過(guò)如何實(shí)現(xiàn)列表切分榆骚,那如何讓這個(gè) list
的 partition
函數(shù)可以像 str.partition
一樣調(diào)用呢桩盲。
直接修改 list
的屬性是行不通的,會(huì)得到 TypeError: can't set attributes of built-in/extension type 'list'
的報(bào)錯(cuò)局雄。所以要通過(guò) builtins
和 collections
間接達(dá)成目的紧唱。
builtins
模塊提供了對(duì)各種內(nèi)置方法的訪問(wèn),包括我們要用的 list
灰粮。而 collections
提供了各種內(nèi)置類(lèi)型的 Python 的模擬實(shí)現(xiàn)(為了效率仔涩,Python 的內(nèi)置類(lèi)型基本都是 C 實(shí)現(xiàn))。
代碼如下:
# file: mylist.py
import builtins
from collections import UserList
# 擴(kuò)展 list 類(lèi)型
class List(UserList):
def partition(self, size):
return [self[i:i+size] for i in range(0, len(self), size)]
# 替換
builtins.list = List
# file: main.py
import mylist
print(list)
print(list(['a', 'b', 'c']).partition(2))
# <class 'mylist.List'>
# [['a', 'b'], ['c']]
print([].__class__)
# <class 'list'>
# 由于命名空間的關(guān)系粘舟,直接通過(guò) [] 語(yǔ)法構(gòu)建的列表沒(méi)有被替換