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 os模块中的isfile()和isdir()函数均返回false问题解决方法
Feb 04 Python
Python读取图片属性信息的实现方法
Sep 11 Python
python3解析库BeautifulSoup4的安装配置与基本用法
Jun 26 Python
使用tensorflow实现线性svm
Sep 07 Python
Python之两种模式的生产者消费者模型详解
Oct 26 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
Django中使用极验Geetest滑动验证码过程解析
Jul 31 Python
Python实现图片识别加翻译功能
Dec 26 Python
python实现Oracle查询分组的方法示例
Apr 30 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
Nov 11 Python
Pycharm Plugins加载失败问题解决方案
Nov 28 Python
python数据分析之用sklearn预测糖尿病
Apr 22 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 file_get_contents取文件中数组元素的方法
2017/04/01 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
javascript 强制刷新页面的实现代码
2009/12/13 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
全面解析Bootstrap中form、navbar的使用方法
2016/05/30 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
javascript闭包的使用之按钮切换功能
2018/08/30 Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
2018/12/25 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
深入理解react 组件类型及使用场景
2019/03/07 Javascript
js form表单input框限制20个字符,10个汉字代码实例
2019/04/12 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
[47:08]OG vs INfamous 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python局部赋值的规则
2013/03/07 Python
Python 的 Socket 编程
2015/03/24 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
Python获取SQLite查询结果表列名的方法
2017/06/21 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
python通过txt文件批量安装依赖包的实现步骤
2019/08/13 Python
网站编辑求职信
2013/10/17 职场文书
档案接收函范文
2014/01/10 职场文书
网上开店必备创业计划书
2014/01/26 职场文书
药剂专业个人求职信范文
2014/04/29 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
关于十八大的演讲稿
2014/09/15 职场文书
Nginx源码编译安装过程记录
2021/11/17 Servers
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫
nginx日志格式分析和修改
2022/04/28 Servers
python通过新建环境安装tfx的问题
2022/05/20 Python