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实现PS滤镜特效Marble Filter玻璃条纹扭曲效果示例
Jan 29 Python
Python操作mongodb数据库进行模糊查询操作示例
Jun 09 Python
python for 循环获取index索引的方法
Feb 01 Python
Python中numpy模块常见用法demo实例小结
Mar 16 Python
在Python中COM口的调用方法
Jul 03 Python
8种用Python实现线性回归的方法对比详解
Jul 10 Python
python__name__原理及用法详解
Nov 02 Python
python实现同一局域网下传输图片
Mar 20 Python
python实现图像全景拼接
Mar 27 Python
如何理解python面向对象编程
Jun 01 Python
python实现图像随机裁剪的示例代码
Dec 10 Python
pytorch分类模型绘制混淆矩阵以及可视化详解
Apr 07 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
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
javascript 一些用法小结
2009/09/11 Javascript
js cookies实现简单统计访问次数
2009/11/24 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
Visual Studio中js调试的方法图解
2014/06/30 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
APP中javascript+css3实现下拉刷新效果
2016/01/27 Javascript
javascript实现右侧弹出“分享到”窗口效果
2016/02/01 Javascript
JS小数运算出现多为小数问题的解决方法
2016/06/02 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
微信小程序实现底部导航
2018/11/05 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
Element ui 下拉多选时新增一个选择所有的选项
2019/08/21 Javascript
vue项目中微信登录的实现操作
2020/09/08 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[04:04]显微镜下的DOTA2第六期——电影级别的华丽团战
2014/06/20 DOTA
python在linux中输出带颜色的文字的方法
2014/06/19 Python
一个基于flask的web应用诞生 flask和mysql相连(4)
2017/04/11 Python
Python常见字典内建函数用法示例
2018/05/14 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
Django 数据库同步操作技巧详解
2019/07/19 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python基于smtplib模块发送邮件代码实例
2020/05/29 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
html5 实现客户端验证上传文件的大小(简单实例)
2016/05/15 HTML / CSS
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
个人党性剖析材料
2014/02/03 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
一年级班主任工作总结2014
2014/11/08 职场文书
营业用房租赁协议书
2014/11/26 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书