之前写到过如何实现列表切分,那如何让这个 list 的 partition 函数可以像 str.partition 一样调用呢。
直接修改 list 的属性是行不通的,会得到 TypeError: can't set attributes of built-in/extension type 'list' 的报错。所以要通过 builtins 和 collections 间接达成目的。
builtins 模块提供了对各种内置方法的访问,包括我们要用的 list。而 collections 提供了各种内置类型的 Python 的模拟实现(为了效率,Python 的内置类型基本都是 C 实现)。
代码如下:
# file: mylist.py
import builtins
from collections import UserList
# 扩展 list 类型
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'>
# 由于命名空间的关系,直接通过 [] 语法构建的列表没有被替换