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 相关文章推荐
Python BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
python rsa 加密解密
Mar 20 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
python 3.7.0 下pillow安装方法
Aug 27 Python
Python+OpenCV+pyQt5录制双目摄像头视频的实例
Jun 28 Python
python 读取数据库并绘图的实例
Dec 03 Python
Pytorch基本变量类型FloatTensor与Variable用法
Jan 08 Python
Python OpenCV读取显示视频的方法示例
Feb 20 Python
在 Linux/Mac 下为Python函数添加超时时间的方法
Feb 20 Python
Python logging模块写入中文出现乱码
May 21 Python
Python venv虚拟环境配置过程解析
Jul 08 Python
Scrapy实现模拟登录的示例代码
Feb 21 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
支持oicq头像的留言簿(一)
2006/10/09 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
php和js实现根据子网掩码和ip计算子网功能示例
2019/11/09 PHP
网上应用的一个不错common.js脚本
2007/08/08 Javascript
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
javascript 对象定义方法 简单易学
2009/03/22 Javascript
JQuery 操作select标签实现代码
2010/05/14 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
Bootstrap Metronic完全响应式管理模板学习笔记
2016/07/08 Javascript
基于Bootstrap的Metronic框架实现页面链接收藏夹功能
2016/08/29 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
layer弹出层父子页面事件相互调用方法
2018/08/17 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
Python Sql数据库增删改查操作简单封装
2016/04/18 Python
使用tensorflow实现AlexNet
2017/11/20 Python
python线程池threadpool实现篇
2018/04/27 Python
Python实现的质因式分解算法示例
2018/05/03 Python
查找python项目依赖并生成requirements.txt的方法
2018/07/10 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
2019/06/21 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python 常见的排序算法实现汇总
2020/08/21 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
关于python3.9安装wordcloud出错的问题及解决办法
2020/11/02 Python
python SOCKET编程基础入门
2021/02/27 Python
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
C#面试常见问题
2013/02/25 面试题
2014年国庆节广播稿
2014/09/19 职场文书
给校长的一封检讨书
2014/09/20 职场文书
canvas 中如何实现物体的框选
2022/08/05 Javascript