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实现类似jQuery使用中的链式调用的示例
Jun 16 Python
Python实现好友全头像的拼接实例(推荐)
Jun 24 Python
Python设计模式之工厂模式简单示例
Jan 09 Python
详解Python中如何写控制台进度条的整理
Mar 07 Python
Python实现将Excel转换成xml的方法示例
Aug 25 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
Django发送邮件和itsdangerous模块的配合使用解析
Aug 10 Python
FFrpc python客户端lib使用解析
Aug 24 Python
Python 中使用 PyMySQL模块操作数据库的方法
Nov 10 Python
Python内置方法实现字符串的秘钥加解密(推荐)
Dec 09 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
Jun 09 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 编写的日历
2006/10/09 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
解析php中如何调用用户自定义函数
2013/08/06 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
PHP7 错误处理机制修改
2021/03/09 PHP
Dojo 学习要点
2010/09/03 Javascript
Javascript 类型转换方法
2010/10/24 Javascript
JS对象与JSON格式数据相互转换
2012/02/20 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
JavaScript将Web页面内容导出到Word及Excel的方法
2015/02/13 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
jQuery animate和CSS3相结合实现缓动追逐效果附源码下载
2016/04/18 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
Javascript小技能总结(推荐)
2016/06/02 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
2016/06/10 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
微信小程序实现锚点跳转
2020/11/23 Javascript
[03:37]2014DOTA2国际邀请赛 主赛事第一日胜者组TOPPLAY
2014/07/19 DOTA
python 常见字符串与函数的用法详解
2018/11/23 Python
python os模块简单应用示例
2019/05/23 Python
Python之time模块的时间戳,时间字符串格式化与转换方法(13位时间戳)
2019/08/12 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
美国智能家居专家:tink
2019/06/04 全球购物
介绍一下XMLHttpRequest对象
2012/02/12 面试题
党课培训主持词
2014/04/01 职场文书
股东协议书范本
2014/04/14 职场文书
保证书格式范文
2014/04/28 职场文书
企业承诺书格式
2014/05/21 职场文书
小学综合实践活动总结
2014/07/07 职场文书
离婚被告代理词
2015/05/23 职场文书
党员转正党支部意见
2015/06/02 职场文书
周末问候语大全
2015/11/10 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python