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入门必须知道的11个知识点
Mar 21 Python
python中join()方法介绍
Oct 11 Python
详解python深浅拷贝区别
Jun 24 Python
python logging模块书写日志以及日志分割详解
Jul 22 Python
python多线程扫描端口(线程池)
Sep 04 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
python有序查找算法 二分法实例解析
Feb 18 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
Mar 04 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
Nov 18 Python
python3 os进行嵌套操作的实例讲解
Nov 19 Python
python飞机大战游戏实例讲解
Dec 04 Python
Python+Selenium实现读取网易邮箱验证码
Mar 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
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP 第一节 php简介
2012/04/28 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
详解EventDispatcher事件分发组件
2016/12/25 PHP
innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
2007/06/29 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
jquery插件推荐 jquery.cookie
2014/11/09 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
深入浅析Extjs中store分组功能的使用方法
2016/04/20 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
label+input实现按钮开关切换效果的实例
2017/08/16 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
python3.0 字典key排序
2008/12/24 Python
python Django连接MySQL数据库做增删改查
2013/11/07 Python
pyv8学习python和javascript变量进行交互
2013/12/04 Python
Python实现模拟时钟代码推荐
2015/11/08 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
2017/08/08 Python
浅谈python中的正则表达式(re模块)
2017/10/17 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
Python Django 前后端分离 API的方法
2019/08/28 Python
介绍一下Linux中的链接
2016/05/28 面试题
酒店员工检讨书
2014/02/18 职场文书
2014年招商工作总结
2014/11/22 职场文书
教师先进个人材料
2014/12/17 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
年中了,该如何写好个人述职报告?
2019/07/02 职场文书
Nginx下SSL证书安装部署步骤介绍
2021/12/06 Servers
spring boot实现文件上传
2022/08/14 Java/Android