Python学习之路(43)——自定义容器(container)

Python中常见的容器类型包括dict、tuple、list和string。其中,tuple和string是不可变容器,dict和list是可变容器。其区别在于,不可变容器一旦赋值后,其元素不能进行修改。

然而,有时针对特殊需求,我们还需要自定义容易。

1、自定义不可变容器类型:需要定义__len__和__getitem__方法;

2、自定义可变容器类型:除需要定义__len__和__getitem__方法外,还需要定义__setitem__和__getitem__方法;

3、自定义的数据类型需要迭代:需要定义__iter__

4、返回自定义容器的长度:需要实现__len__(self)

5、自定义容易可以调用 self[key] , 如果key类型错误,抛出 TypeError ,如果无法返回 key 对应的数值时,抛出 ValueError :需要调用的是__getitem__(self, key)这个方法

6、当执行 self[key] = value 时:需要调用的是__setitem__(self, key, value)这个方法

7、当执行 del self[key]时:需要调用的是__delitem__(self, key)这个方法

8、当容器可以执行 for x in container: ,或者使用iter(container)时:需要实现__iter__(self),该方法返回的是一个迭代器

看一个例子,创建一个容器,该容器加强了内置类型list的功能,增加一些方法:

1#!/usr/bin/env python3 2# -*- coding: UTF-8 -*- 3 4class FunctionalList: 5 ''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take''' 6 7 def __init__(self, values=None): 8 if values is None: 9 self.values = [] 10 else: 11 self.values = values 12 13 def __len__(self): 14 return len(self.values) 15 16 def __getitem__(self, key): 17 return self.values[key] 18 19 def __setitem__(self, key, value): 20 self.values[key] = value 21 22 def __delitem__(self, key): 23 del self.values[key] 24 25 def __iter__(self): 26 return iter(self.values) 27 28 def __reversed__(self): 29 return FunctionalList(reversed(self.values)) 30 31 def append(self, value): 32 self.values.append(value) 33 34 def head(self): 35 # 获取第一个元素 36 return self.values[0] 37 38 def tail(self): 39 # 获取第一个元素之后的所有元素 40 return self.values[1:] 41 42 def init(self): 43 # 获取最后一个元素之前的所有元素 44 return self.values[:-1] 45 46 def last(self): 47 # 获取最后一个元素 48 return self.values[-1] 49 50 def drop(self, n): 51 # 获取所有元素,除了前N52 return self.values[n:] 53 54 def take(self, n): 55 # 获取前N个元素 56 return self.values[:n] 57 58if __name__ == '__main__': 59 l = FunctionalList([1,2,3,4,5,6]) 60 print("length:", len(l)) 61 print("l[2]:", l[2]) 62 l[2] = 33 63 print("l[2]:", l[2]) 64 print("l.head():", l.head()) 65 print("l.tail():", l.tail()) 66 print("l.last():", l.last()) 67 print("l.drop(3):", l.drop(3)) 68 print("l.take(3):", l.take(3)) 69 70##########执行结果########## 71C:\Python35\python3.exe D:/Project/Python/Pro_py3/test.py 72length: 6 73l[2]: 3 74l[2]: 33 75l.head(): 1 76l.tail(): [2, 33, 4, 5, 6] 77l.last(): 6 78l.drop(3): [4, 5, 6] 79l.take(3): [1, 2, 33] 80 81Process finished with exit code 0
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Python之time模块的时间戳、时间字符串格式化与转换

Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y