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的功能,增加一些方法:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
class FunctionalList:
''' 实现了内置类型list的功能,并丰富了一些其他方法: head, tail, init, last, drop, take'''
def __init__(self, values=None):
if values is None:
self.values = []
else:
self.values = values
def __len__(self):
return len(self.values)
def __getitem__(self, key):
return self.values[key]
def __setitem__(self, key, value):
self.values[key] = value
def __delitem__(self, key):
del self.values[key]
def __iter__(self):
return iter(self.values)
def __reversed__(self):
return FunctionalList(reversed(self.values))
def append(self, value):
self.values.append(value)
def head(self):
# 获取第一个元素
return self.values[0]
def tail(self):
# 获取第一个元素之后的所有元素
return self.values[1:]
def init(self):
# 获取最后一个元素之前的所有元素
return self.values[:-1]
def last(self):
# 获取最后一个元素
return self.values[-1]
def drop(self, n):
# 获取所有元素,除了前N个
return self.values[n:]
def take(self, n):
# 获取前N个元素
return self.values[:n]
if __name__ == '__main__':
l = FunctionalList([1,2,3,4,5,6])
print("length:", len(l))
print("l[2]:", l[2])
l[2] = 33
print("l[2]:", l[2])
print("l.head():", l.head())
print("l.tail():", l.tail())
print("l.last():", l.last())
print("l.drop(3):", l.drop(3))
print("l.take(3):", l.take(3))
##########执行结果##########
C:\Python35\python3.exe D:/Project/Python/Pro_py3/test.py
length: 6
l[2]: 3
l[2]: 33
l.head(): 1
l.tail(): [2, 33, 4, 5, 6]
l.last(): 6
l.drop(3): [4, 5, 6]
l.take(3): [1, 2, 33]
Process finished with exit code 0