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高效编程技巧
Jan 07 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
Python创建模块及模块导入的方法
May 27 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
python数组过滤实现方法
Jul 27 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
详解python的ORM中Pony用法
Feb 09 Python
Python判断telnet通不通的实例
Jan 26 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
python实现将一维列表转换为多维列表(numpy+reshape)
Nov 29 Python
python能自学吗
Jun 18 Python
Python Pandas知识点之缺失值处理详解
May 11 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获取mysql版本的几种方法小结
2008/03/25 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
php简单备份与还原MySql的方法
2016/05/09 PHP
php多线程并发实现方法
2016/09/30 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Javascript 日期处理之时区问题
2009/10/08 Javascript
XENON基于JSON变种
2010/07/27 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
JavaScript实现的原生态兼容IE6可调可控滚动文字功能详解
2017/09/19 Javascript
Vue实现导航栏点击当前标签变色功能
2020/08/19 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python制作小说爬虫实录
2017/08/14 Python
将TensorFlow的模型网络导出为单个文件的方法
2018/04/23 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
深入浅析Python 函数注解与匿名函数
2020/02/24 Python
python爬虫数据保存到mongoDB的实例方法
2020/07/28 Python
日本高端护肤品牌:Tatcha
2016/08/29 全球购物
美国和加拿大房车出售在线分类广告:RVT.com
2018/04/23 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
C语言编程题
2015/03/09 面试题
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
介绍一下Linux内核的排队自旋锁
2014/01/04 面试题
2014春晚主持词
2014/03/25 职场文书
党校培训自我鉴定范文
2014/04/10 职场文书
2014县政府领导班子三严三实对照检查材料思想汇报
2014/09/26 职场文书
安全生产标语大全
2014/10/06 职场文书
周一问候语大全
2015/11/10 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
一条 SQL 语句执行过程
2022/03/17 MySQL