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利用hook技术破解https的实例代码
Mar 25 Python
Python中请使用isinstance()判断变量类型
Aug 25 Python
理解Python中的With语句
Feb 02 Python
python中redis的安装和使用
Dec 04 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
利用python将图片转换成excel文档格式
Dec 30 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
Python实现Linux监控的方法
May 16 Python
pytorch方法测试详解——归一化(BatchNorm2d)
Jan 15 Python
TensorFlow命名空间和TensorBoard图节点实例
Jan 23 Python
Python读取ini配置文件传参的简单示例
Jan 05 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
使用无限生命期Session的方法
2006/10/09 PHP
搜索和替换文件或目录的一个好类--很实用
2006/10/09 PHP
PHP写杨辉三角实例代码
2011/07/17 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
实例分析10个PHP常见安全问题
2019/07/09 PHP
jQuery.Validate 使用笔记(jQuery Validation范例 )
2010/06/25 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JQuery基础语法小结
2015/02/27 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
js实现n秒倒计时后才可以点击的效果
2015/12/20 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
BootStrap实现轮播图效果(收藏)
2016/12/30 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
vue路由组件按需加载的几种方法小结
2018/07/12 Javascript
vue实现键盘输入支付密码功能
2018/08/18 Javascript
解决vue prop传值default属性如何使用,为何不生效的问题
2020/09/21 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
python中的break、continue、exit()、pass全面解析
2017/08/05 Python
python3实现SMTP发送邮件详细教程
2018/06/19 Python
Python itertools.product方法代码实例
2020/03/27 Python
python爬虫用mongodb的理由
2020/07/28 Python
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
2014/01/13 面试题
制定岗位职责的原则
2013/11/08 职场文书
办公室经理岗位职责
2014/01/01 职场文书
测试工程师程序员求职信范文
2014/02/20 职场文书
企业业务员岗位职责
2014/03/14 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
法定代表人资格证明书
2015/06/18 职场文书
VUE递归树形实现多级列表
2022/07/15 Vue.js