Python 修改内置类型

之前写到过如何实现列表切分,那如何让这个 listpartition 函数可以像 str.partition 一样调用呢。

直接修改 list 的属性是行不通的,会得到 TypeError: can't set attributes of built-in/extension type 'list' 的报错。所以要通过 builtinscollections 间接达成目的。

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))
# 
# [['a', 'b'], ['c']]
print([].__class__)
# 
# 由于命名空间的关系,直接通过 [] 语法构建的列表没有被替换

你可能感兴趣的:(Python 修改内置类型)