Python扩展内置类型详解
作者:KLeonard 发布时间:2023-03-19 17:23:36
除了实现新的种类的对象以外,类有时有用于扩展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
[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)
a
(indexing ['a', 'b', 'c'] at 3)
c
['a', 'b', 'c', 'spam']
['spam', 'c', 'b', 'a']
有关另一个类型子类的例子,可以参考bool类型的实现,可以看到bool类是int的子类,有两个实例(True和False),行为就像整数1和0,但是继承了定制后的字符串表达方式来显示其变量名。
来源:https://blog.csdn.net/gavin_john/article/details/50733641


猜你喜欢
- 一、数据库的建立和销毁建立数据库:create database [if not exists] 数据库名 [default charset
- Declaring class members or methods as st
- python自带了日志模块logging,可以用来记录程序运行过程中的日志信息。同时python还有logbook模块用来取代logging
- 常用 ASCII 码表对照表:注意如下几点:0-9:48-57A-Z:65-90a-z:97-122ord()函数介绍: ord(
- 使用RS232串口线或者是RS232转USB的这一类的接口,会需要com口作为接口来进行输入输出调式,写了个脚本来控制COM口,用到了Pyt
- 因一些特殊需求需要以参数的形式获取字典 * 定的值,网上搜了一下并没有特别好的实现(并没有太认真去找~),所以自己实现了一个,以供大家参考:)
- 一、导出数据。 先说明一下自己的环境:Mac OS X 10.8.3, MySQL Community Server 5.6.10, MyS
- 1.简介: SQL Server 2005中的窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地累计总数、移动平均值、以及执行其它计
- 1. 直接打印错误try:# your codeexcept KeyboardInterrupt:print("quit"
- 先设置一个关于书本(book)的数据模型:from django.db import modelsclass Publisher(model
- 程序说明:本程序实现将开发程序服务器中的打包文件通过该脚本上传到正式生产环境(注:生产环境和开发环境不互通)程序基本思路:将开发环境中的程序
- python注释方法方式1单行注释:shift + #(在代码的最前面输入,非选中代码进行注释)多行注释:同单行一样在每一行的前面输入shi
- 对于一些复杂的hdf5文件,通过可视化的方法可以比较容易的了解文件的内部结构,下面介绍基于python的一个hdf5文件的安装使用方法1 安
- 写在前面在一些接口请求的场景中,我们希望携带的数据不希望是以明文的方式提交的,也就是需要对参数做一些混淆或者加密处理,后端拿到数据后再进行解
- 本文实例讲述了jQuery绑定事件监听bind和移除事件监听unbind用法。分享给大家供大家参考,具体如下:这里分别采用后bind(eve
- 1.引言热力图的想法很简单,用颜色替换数字。现在,这种可视化风格已经从最初的颜色编码表格走了很长一段路。热力图被广泛用于地理空间数据。这种图
- python的正则是通过re模块的支持匹配的3个函数match :只从字符串的开始与正则表达式匹配,匹配成功返回matchobject,否则
- 一、Selenium介绍与配置1.Selenium简介Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具
- 你一定听说过这句著名的数据科学名言:在数据科学项目中, 80% 的时间是在做数据处理。如果你没有听过,那么请记住:数据清洗是数据科学工作流程
- 总括pandas的索引函数主要有三种:loc 标签索引,行和列的名称iloc 整型索引(绝对位置索引),绝对意义上的几行几列,起始索引为0i