Python实现扩展内置类型的方法分析


Posted in Python onOctober 16, 2017

本文实例讲述了Python实现扩展内置类型的方法。分享给大家供大家参考,具体如下:

简介

除了实现新的类型的对象方式外,有时我们也可以通过扩展Python内置类型,从而支持其它类型的数据结构,比如为列表增加队列的插入和删除的方法。本文针对此问题,结合实现集合功能的实例,介绍了扩展Python内置类型的两种方法:通过嵌入内置类型来扩展类型和通过子类方式扩展类型。

通过嵌入内置类型扩展

下面例子通过将list对象作为嵌入类型,实现集合对象,并增加了一下运算符重载。这个类知识包装了Python的列表,以及附加的集合运算。

class Set:
  def __init__(self, value=[]): # Constructor
    self.data = [] # Manages a list
    self.concat(value)
  def intersect(self, other): # other is any sequence
    res = [] # self is the subject
    for x in self.data:
      if x in other: # Pick common items
        res.append(x)
    return Set(res) # Return a new Set
  def union(self, other): # other is any sequence
    res = self.data[:] # Copy of my list
    for x in other: # Add items in other
      if not x in res:
        res.append(x)
    return Set(res)
  def concat(self, value): # value: list, Set...
    for x in value: # Removes duplicates
      if not x in self.data:
        self.data.append(x)
  def __len__(self):     return len(self.data) # len(self)
  def __getitem__(self, key): return self.data[key] # self[i]
  def __and__(self, other):  return self.intersect(other) # self & other
  def __or__(self, other):  return self.union(other) # self | other
  def __repr__(self):     return 'Set:' + repr(self.data) # print()
if __name__ == '__main__':
  x = Set([1, 3, 5, 7])
  print(x.union(Set([1, 4, 7]))) # prints Set:[1, 3, 5, 7, 4]
  print(x | Set([1, 4, 6])) # prints Set:[1, 3, 5, 7, 4, 6]

通过子类方式扩展类型

从Python2.2开始,所有内置类型都能直接创建子类,如list,str,dict以及tuple。这样可以让你通过用户定义的class语句,定制或扩展内置类型:建立类型名称的子类并对其进行定制。类型的子类型实例,可用在原始的内置类型能够出现的任何地方。

class Set(list):
  def __init__(self, value = []):   # Constructor
    list.__init__([])        # Customizes list
    self.concat(value)        # Copies mutable defaults
  def intersect(self, other):     # other is any sequence
    res = []             # self is the subject
    for x in self:
      if x in other:        # Pick common items
        res.append(x)
    return Set(res)         # Return a new Set
  def union(self, other):       # other is any sequence
    res = Set(self)         # Copy me and my list
    res.concat(other)
    return res
  def concat(self, value):       # value: list, Set . . .
    for x in value:         # Removes duplicates
      if not x in self:
        self.append(x)
  def __and__(self, other): return self.intersect(other)
  def __or__(self, other): return self.union(other)
  def __repr__(self):    return 'Set:' + list.__repr__(self)
if __name__ == '__main__':
  x = Set([1,3,5,7])
  y = Set([2,1,4,5,6])
  print(x, y, len(x))
  print(x.intersect(y), y.union(x))
  print(x & y, x | y)
  x.reverse(); print(x)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
深入学习Python中的装饰器使用
Jun 20 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
Jul 25 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
24式加速你的Python(小结)
Jun 13 Python
python数据归一化及三种方法详解
Aug 06 Python
使用python模拟高斯分布例子
Dec 09 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
Feb 18 Python
keras之权重初始化方式
May 21 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
Spy++的使用方法及下载教程
Jan 29 Python
python flask框架快速入门
May 14 Python
用python修改excel表某一列内容的操作方法
Jun 11 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
Oct 16 #Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 #Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 #Python
python中文件变化监控示例(watchdog)
Oct 16 #Python
python中import reload __import__的区别详解
Oct 16 #Python
使用Python操作excel文件的实例代码
Oct 15 #Python
python出现"IndentationError: unexpected indent"错误解决办法
Oct 15 #Python
You might like
cmd下运行php脚本
2008/11/25 PHP
php自动获取目录下的模板的代码
2010/08/08 PHP
php禁用函数设置及查看方法详解
2016/07/25 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
XML+XSL 与 HTML 两种方案的结合
2007/04/22 Javascript
javascript 短路法代码精简
2009/08/20 Javascript
JavaScript DOM学习第八章 表单错误提示
2010/02/19 Javascript
JavaScript调试技巧之console.log()详解
2014/03/19 Javascript
使用insertAfter()方法在现有元素后添加一个新元素
2014/05/28 Javascript
分享一则JavaScript滚动条插件源码
2015/03/03 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
Vue Promise的axios请求封装详解
2018/08/13 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
[03:04]DOTA2超级联赛专访ZSMJ “莫名其妙”的逆袭
2013/05/23 DOTA
在ironpython中利用装饰器执行SQL操作的例子
2015/05/02 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
解决python 无法加载downsample模型的问题
2018/10/25 Python
Python编程快速上手——PDF文件操作案例分析
2020/02/28 Python
python计算导数并绘图的实例
2020/02/29 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
简单了解Python变量作用域正确使用方法
2020/06/12 Python
欧洲最大的美妆零售网站:Feelunique
2017/01/14 全球购物
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
数据库笔试题
2013/05/09 面试题
设置器与访问器的定义以及各自特点
2016/01/08 面试题
银行主办会计岗位职责
2014/08/13 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
员工辞退通知书
2015/04/17 职场文书
医院志愿者活动总结
2015/05/06 职场文书
Redis+Lua脚本实现计数器接口防刷功能(升级版)
2022/02/12 Redis