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中操作时间之strptime()方法的使用
Dec 30 Python
python基础教程之Filter使用方法
Jan 17 Python
Python编程实现数学运算求一元二次方程的实根算法示例
Apr 02 Python
python 日期操作类代码
May 05 Python
Ubuntu下使用python读取doc和docx文档的内容方法
May 08 Python
python 通过类中一个方法获取另一个方法变量的实例
Jan 22 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
Python+OpenCV实现旋转文本校正方式
Jan 09 Python
Python with标签使用方法解析
Jan 17 Python
Python3.9又更新了:dict内置新功能
Feb 28 Python
基于PyQT实现区分左键双击和单击
May 19 Python
python中@property的作用和getter setter的解释
Dec 22 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
php下删除字符串中HTML标签的函数
2008/08/27 PHP
PHP中数据库单例模式的实现代码分享
2014/08/21 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
javascript高级学习笔记整理
2011/08/14 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
2012/04/20 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
2017/08/14 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
学习RxJS之JavaScript框架Cycle.js
2019/06/17 Javascript
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
Windows下Python使用Pandas模块操作Excel文件的教程
2016/05/31 Python
Django配置celery(非djcelery)执行异步任务和定时任务
2018/07/16 Python
Linux下多个Python版本安装教程
2018/08/15 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
python实现邮件发送功能
2019/08/10 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
Python字典底层实现原理详解
2019/12/18 Python
Unineed中文官网:高端护肤美妆与时尚配饰,英国直邮
2020/07/23 全球购物
网络工程师的自我评价
2013/10/02 职场文书
个人实用的自我评价范文
2013/11/23 职场文书
五十岁生日宴会答谢词
2014/01/15 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
入伍志愿书怎么写?
2019/07/19 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
索尼ICF-36收音机评测
2022/04/30 无线电