Python扩展内置类型详解
除了实现新的种类的对象以外,类有时有用于扩展Python的内置类型的功能。主要有以下两种技术:
通过嵌入扩展类型
下例把一些集合函数变成方法,而且新增了一些基本运算符重载,实现了新的集合对象。对于多数类而言,这个类只是包装了Python列表,以及附加的集合运算。
#File setwrapper.py class Set: def __init__(self,value=[]):#构造函数 self.data = [] self.concat(value) def intersect(self,other):#求交集 res = [] for x in self.data: if x in other: res.append(x) return Set(res) #返回一个新的Set def union(self,other):#求并集 res = self.data[:] #复制self.data for x in other: if not x in res: res.append(x) return Set(res) def concat(self,value): for x in value: if not x in self.data: self.data.append(x) def __len__(self): # len(self) return len(self.data) def __getitem__(self,key): # self[i] return self.data[key] def __and__(self,other): # self & other return self.intersect(other) def __or__(self,other): # self | other return self.union(other) def __repr__(self): # print return 'Set:' + repr(self.data) if __name__ == '__main__': #测试用例 x = Set([1,3,5,7]) print(x.union(Set([1,4,7]))) print(x | Set([1,4,6])) print(x[2]) print(x[2:4])
重载索引运算让Set类的实例可以充当真正的列表。运行结果如下:
>>>
Set:[1, 3, 5, 7, 4]
Set:[1, 3, 5, 7, 4, 6]
5
[5, 7]
通过子类扩展类型
从Python2.2开始,所有内置类型都可以直接创建子类。
这样让你可以通过用户定义的class语句,定制或扩展内置类型的行为:建立类型名称的子类并对其进行定制。类型的子类实例,可以用在原始的内置类型能够出现的任何地方。
例如,假如你对Python列表偏移值以0开始计算而不是1开始一直很困扰,这时你就可以编写自己的子类,定制列表的核心行为,如下:
# File typesubclass.py #Map 1..N to 0..N-1; call back to built-in version class MyList(list): def __getitem__(self,offset): print('(indexing %s at %s)'%(self,offset)) return list.__getitem__(self,offset-1) if __name__ == '__main__': print(list('abc')) x = MyList('abc') print(x) print(x[1]) print(x[3]) x.append('spam') print(x) x.reverse() print(x)
在这个文件中,MyList子类扩展了内置list类型的__getitem__索引运算方法,把索引1到N映射到实际的0到N-1。运行结果如下:
>>>
['a', 'b', 'c']
['a', 'b', 'c']
(indexing ['a', 'b', 'c'] at 1)
a
(indexing ['a', 'b', 'c'] at 3)
c
['a', 'b', 'c', 'spam']
['spam', 'c', 'b', 'a']
有关另一个类型子类的例子,可以参考bool类型的实现,可以看到bool类是int的子类,有两个实例(True和False),行为就像整数1和0,但是继承了定制后的字符串表达方式来显示其变量名。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- 获奖案例:国航&百度“微笑启航”AI主题航班
- MySQL高可用架构-MMM环境部署记录
- Silverlight之ListBox/Style学习笔记--ListBox版的图片轮换广告
- MySQL高可用架构-MHA环境部署记录
- 分布式监控系统Zabbix-3.0.3-完整安装记录 - 添加shell脚本监控
- Flash/Flex学习笔记(52):使用TweenLite
- 设计一个界面,很简单!
- 配置Quartz.net Cluster以及远程管理
- [原创]CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- Flash/Flex学习笔记(49):3D基础
- Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)
- Linux系统批量化安装部署之Cobbler
- 解决JQuery中的ready函数冲突
- 关于监视容器我们了解的5件事
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python图像灰度变换及图像数组操作
- 典型算法的Python实现
- Spring是如何解决循环依赖的
- Python将两个列表转换为字典
- 三、基于promise封装属于自己的Ajax库
- 数据分析 常见异常及解决办法(一)
- Python数据分析实战(2)使用Pandas进行数据分析
- 【redis】redis内存管理、淘汰机制、内存优化
- 如何防止网站被扒的解决方法!
- 【python-面试题53-循环排序】寻找缺失的数
- 【python-leetcode42-区间合并】区间列表的交集
- 【python-leetcode202-快慢指针】快乐数
- vuejs之结合使用vue+element-ui搭建后台管理页面
- 【python-leetcode142-快慢指针】环形链表2
- 【python-leetcode141-快慢指针】环形链表