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编写检测数据库SA用户的方法
Jul 11 Python
python映射列表实例分析
Jan 26 Python
Python多线程经典问题之乘客做公交车算法实例
Mar 22 Python
http请求 request失败自动重新尝试代码示例
Jan 25 Python
Python使用Pickle库实现读写序列操作示例
Jun 15 Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 Python
python 实现批量替换文本中的某部分内容
Dec 13 Python
Python代码块及缓存机制原理详解
Dec 13 Python
基于FME使用Python过程图解
May 13 Python
Python实现SMTP邮件发送
Jun 16 Python
Python初学者必备的文件读写指南
Jun 23 Python
python编程实现清理微信重复缓存文件
Nov 01 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截取汉字乱码问题解决方法mb_substr函数的应用
2008/03/30 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
详解PHP中的PDO类
2015/07/06 PHP
PHP操作MySQL的mysql_fetch_* 函数的常见用法教程
2015/12/25 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
laravel 解决后端无法获取到前端Post过来的值问题
2019/10/22 PHP
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
深入理解JavaScript高级之词法作用域和作用域链
2013/12/10 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
javascript实现多栏闭合展开式广告位菜单效果实例
2015/08/05 Javascript
jQuery实现带幻灯的tab滑动切换风格菜单代码
2015/08/27 Javascript
轻松使用jQuery双向select控件Bootstrap Dual Listbox
2015/12/13 Javascript
详解javascript高级定时器
2015/12/31 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
IE11下处理Promise及Vue的单项数据流问题
2019/07/24 Javascript
JavaScript实现模态对话框实例
2020/01/13 Javascript
微信小程序 bindtap 传参的实例代码
2020/02/21 Javascript
[06:45]DOTA2-DPC中国联赛 正赛 Magma vs LBZS 选手采访
2021/03/11 DOTA
Python面向对象之类的定义与继承用法示例
2019/01/14 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
Python绘制词云图之可视化神器pyecharts的方法
2021/02/23 Python
解决pytorch 数据类型报错的问题
2021/03/03 Python
深入CSS3 动画效果的总结详解
2013/05/09 HTML / CSS
2019年分享net面试的经历和题目
2016/08/07 面试题
关爱留守儿童倡议书
2014/04/15 职场文书
感恩之星事迹材料
2014/05/03 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
避暑山庄导游词
2015/02/04 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电