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实现12306火车票查询器
Apr 20 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
pygame库实现移动底座弹球小游戏
Apr 14 Python
python之pymysql模块简单应用示例代码
Dec 16 Python
如何基于python操作json文件获取内容
Dec 24 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
利用python实现逐步回归
Feb 24 Python
python序列类型种类详解
Feb 26 Python
在Django中预防CSRF攻击的操作
Mar 13 Python
Python实现读取并写入Excel文件过程解析
May 27 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
Jun 22 Python
Python字典的基础操作
Nov 01 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
PHP5中使用PDO连接数据库的方法
2010/08/01 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
解析javascript 数组以及json元素的添加删除
2013/06/26 Javascript
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
js组件SlotMachine实现图片切换效果制作抽奖系统
2016/04/17 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
Vue2.0表单校验组件vee-validate的使用详解
2017/05/02 Javascript
jQuery实现弹幕特效
2019/11/29 jQuery
vue中根据时间戳判断对应的时间(今天 昨天 前天)
2019/12/20 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
python异常和文件处理机制详解
2016/07/19 Python
Python实现的json文件读取及中文乱码显示问题解决方法
2018/08/06 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
python 多进程共享全局变量之Manager()详解
2019/08/15 Python
python支付宝支付示例详解
2019/08/22 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
HTML5实现无刷新修改URL的方法
2019/11/14 HTML / CSS
Qoo10马来西亚:全球时尚和引领潮流的购物市场
2016/08/25 全球购物
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
法国娇韵诗官方旗舰店:Clarins是来自法国的天然护肤品牌
2018/06/30 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
Java语言程序设计测试题选择题部分
2014/04/03 面试题
毕业生物理教师求职信
2013/10/17 职场文书
接受捐赠答谢词
2014/01/27 职场文书
《去年的树》教学反思
2014/04/11 职场文书
实习协议书范本
2014/09/25 职场文书
2014最新党员违纪检讨书
2014/10/12 职场文书
检讨书格式
2015/01/23 职场文书
三好学生个人总结
2015/02/15 职场文书
致地震灾区的慰问信
2015/03/23 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js