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装饰器decorator用法实例
Nov 10 Python
Python 专题一 函数的基础知识
Mar 16 Python
python用插值法绘制平滑曲线
Feb 19 Python
Tensorflow读取并输出已保存模型的权重数值方式
Jan 04 Python
python 日志 logging模块详细解析
Mar 31 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
keras实现图像预处理并生成一个generator的案例
Jun 17 Python
详解python变量与数据类型
Aug 25 Python
Python Charles抓包配置实现流程图解
Sep 29 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 Python
python爬虫快速响应服务器的做法
Nov 24 Python
Python万能模板案例之matplotlib绘制甘特图
Apr 13 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
Laravel5.1 框架Request请求操作常见用法实例分析
2020/01/04 PHP
Javascript 鼠标移动上去小三角形滑块缓慢跟随效果
2013/04/26 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
js 采用delete实现继承示例代码
2014/05/20 Javascript
JavaScript中的parse()方法使用简介
2015/06/12 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
jquery实现树形菜单完整代码
2015/12/29 Javascript
javascript中setAttribute兼容性用法分析
2016/12/12 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
Node.js使用Koa搭建 基础项目
2018/01/08 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
cdn模式下vue的基本用法详解
2018/10/07 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[02:57]DOTA2亚洲邀请赛 SECRET战队出场宣传片
2015/02/07 DOTA
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
python实现的简单FTP上传下载文件实例
2015/06/30 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
python实现矩阵打印
2019/03/02 Python
python 比较字典value的最大值的几种方法
2020/04/17 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
软件设计的目标是什么
2016/12/04 面试题
Python面试题:Python里面如何生成随机数
2015/03/12 面试题
求职信模板怎么做
2014/01/26 职场文书
学生个人自我鉴定
2014/03/26 职场文书