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生成随机mac地址的方法
Mar 16 Python
python类的继承实例详解
Mar 30 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
python+opencv实现动态物体追踪
Jan 09 Python
python实现守护进程、守护线程、守护非守护并行
May 05 Python
Python函数参数操作详解
Aug 03 Python
django项目简单调取百度翻译接口的方法
Aug 06 Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
Dec 04 Python
python实现井字棋小游戏
Mar 04 Python
python数据抓取3种方法总结
Feb 07 Python
python基于OpenCV模板匹配识别图片中的数字
Mar 31 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循环获取GET和POST值的代码
2008/04/09 PHP
PHP 操作文件的一些FAQ总结
2009/02/12 PHP
浅析php中如何在有限的内存中读取大文件
2013/07/02 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
Laravel 之url参数,获取路由参数的例子
2019/10/21 PHP
laravel 解决paginate查询多个字段报错的问题
2019/10/22 PHP
一种JavaScript的设计模式
2006/11/22 Javascript
用倒置滤镜把div倒置,再把table倒置。
2007/07/31 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
JavaScript调用后台的三种方法实例
2013/10/17 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
JS实现数组按升序及降序排列的方法
2017/04/26 Javascript
Element-ui tree组件自定义节点使用方法代码详解
2018/09/17 Javascript
vue v-for 使用问题整理小结
2019/08/04 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
JavaScript中继承原理与用法实例入门
2020/05/09 Javascript
[02:21]2018完美盛典章节片——初心
2018/12/17 DOTA
Python ORM框架SQLAlchemy学习笔记之安装和简单查询实例
2014/06/10 Python
使用Python的Bottle框架写一个简单的服务接口的示例
2015/08/25 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
Pycharm debug调试时带参数过程解析
2020/02/03 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
adidas澳大利亚官方网站:adidas Australia
2018/04/15 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
公务员职务工作的自我评价
2013/11/01 职场文书
节约每一滴水演讲稿
2014/09/09 职场文书
人与自然观后感
2015/06/16 职场文书
2015年科学教研组工作总结
2015/07/22 职场文书
2016年大学生社会实践心得体会
2015/10/09 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书
python中redis包操作数据库的教程
2022/04/19 Python