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))
# <class 'mylist.List'>
# [['a', 'b'], ['c']]
print([].__class__)
# <class 'list'>
# 由于命名空间的关系,直接通过 [] 语法构建的列表没有被替换
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容