Python扩展内置类型详解


Posted in Python onMarch 26, 2018

除了实现新的种类的对象以外,类有时有用于扩展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, 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) 

(indexing ['a', 'b', 'c'] at 3) 

['a', 'b', 'c', 'spam'] 
['spam', 'c', 'b', 'a'] 

有关另一个类型子类的例子,可以参考bool类型的实现,可以看到bool类是int的子类,有两个实例(True和False),行为就像整数1和0,但是继承了定制后的字符串表达方式来显示其变量名。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
Jul 07 Python
python 除法保留两位小数点的方法
Jul 16 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
opencv实现图片模糊和锐化操作
Nov 19 Python
Python实现去除图片中指定颜色的像素功能示例
Apr 13 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
如何基于python3和Vue实现AES数据加密
Mar 27 Python
Python 字符串池化的前提
Jul 03 Python
详解tensorflow之过拟合问题实战
Nov 01 Python
超级详细实用的pycharm常用快捷键
May 12 Python
python函数式编程学习之yield表达式形式详解
Mar 25 #Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 #Python
python实现隐马尔科夫模型HMM
Mar 25 #Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 #Python
Python实现修改文件内容的方法分析
Mar 25 #Python
利用python为运维人员写一个监控脚本
Mar 25 #Python
python实现数据写入excel表格
Mar 25 #Python
You might like
PHP URL路由类实例
2013/11/12 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
php实现等比例不失真缩放上传图片的方法
2016/11/14 PHP
Yii2下session跨域名共存的解决方案
2017/02/04 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
php file_get_contents取文件中数组元素的方法
2017/04/01 PHP
javascript 鼠标滚轮事件
2009/04/09 Javascript
手把手教你自己写一个js表单验证框架的方法
2010/09/14 Javascript
改写一个简单的菜单 弹性大小
2010/12/02 Javascript
Javascript限制网页只能在微信内置浏览器中访问
2014/11/09 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
AngularJS优雅的自定义指令
2016/07/01 Javascript
JS动态遍历json中所有键值对的方法(不知道属性名的情况)
2016/12/28 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
AngularJS 验证码60秒倒计时功能的实现
2017/06/05 Javascript
js实现简单数字变动效果
2017/11/06 Javascript
Vue用v-for给循环标签自身属性添加属性值的方法
2018/10/18 Javascript
node.js的Express服务器基本使用教程
2019/01/09 Javascript
Javascript表单序列化原理及实现代码详解
2020/10/30 Javascript
[01:39:04]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第二场 2月1日
2021/03/11 DOTA
CentOS中使用virtualenv搭建python3环境
2015/06/08 Python
python图片验证码生成代码
2016/07/02 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
python3 线性回归验证方法
2019/07/09 Python
python UIAutomator2使用超详细教程
2021/02/19 Python
中国海淘族值得信赖的海淘返利网站:55海淘
2017/01/16 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
自我鉴定模板
2013/10/29 职场文书
民族团结好少年事迹材料
2014/08/19 职场文书
教师自查自纠材料
2014/10/14 职场文书
2014年班组长工作总结
2014/11/20 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
保管员岗位职责
2015/02/14 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技