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正则表达式中的括号匹配问题
Dec 14 Python
python实现机器学习之多元线性回归
Sep 06 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
Python字典的核心底层原理讲解
Jan 24 Python
python实现AES加密与解密
Mar 28 Python
python2和python3实现在图片上加汉字的方法
Aug 22 Python
python 中xpath爬虫实例详解
Aug 26 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
python中如何使用insert函数
Jan 09 Python
Python获取android设备cpu和内存占用情况
Nov 15 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
Mar 02 Python
Python import模块的缓存问题解决方案
Jun 02 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动态生成虚拟现实VRML网页
2006/10/09 PHP
APMServ使用说明
2006/10/23 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
PHP连接MSSQL2008/2005数据库(SQLSRV)配置实例
2014/10/22 PHP
php微信公众平台开发类实例
2015/04/01 PHP
javascript事件问题
2009/09/05 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
jquery对象和javascript对象即DOM对象相互转换
2014/08/07 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
JavaScript中捕获/阻止捕获、冒泡/阻止冒泡方法
2016/12/07 Javascript
js模糊查询实例分享
2016/12/26 Javascript
JS对象的深度克隆方法示例
2017/03/16 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
JavaScript反弹动画效果的实现代码
2017/07/13 Javascript
使用Vue开发一个实时性时间转换指令
2018/01/17 Javascript
jQuery实现的简单图片轮播效果完整示例
2018/02/08 jQuery
微信小程序之事件交互操作实例分析
2018/12/03 Javascript
MockJs结合json-server模拟后台数据
2020/08/26 Javascript
Nodejs监听日志文件的变化的过程解析
2019/08/04 NodeJs
微信小程序canvas开发水果老虎机的思路详解
2020/02/07 Javascript
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
Python 实现顺序高斯消元法示例
2019/12/09 Python
Python pandas库中的isnull()详解
2019/12/26 Python
tensorflow实现训练变量checkpoint的保存与读取
2020/02/10 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Python内置异常类型全面汇总
2020/05/28 Python
css3实现元素环绕中心点布局的方法示例
2019/01/15 HTML / CSS
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
J2EE面试题
2016/03/14 面试题
税务干部鉴定材料
2014/02/11 职场文书
事务机电主管工作职责
2014/02/25 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
企业财务人员岗位职责
2015/04/14 职场文书
单位考核鉴定意见
2015/06/05 职场文书
小程序实现侧滑删除功能
2022/06/25 Javascript