之前写到过如何实现列表切分,那如何让这个 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'>
# 由于命名空间的关系,直接通过 [] 语法构建的列表没有被替换