本文共 2559 字,大约阅读时间需要 8 分钟。
Python里的复合数据类型有序列类型,映射类型(字典)和集合类型,它们都是容器类型,所谓的容器类型,就是能存下各种各样的对象
在Python语言中,也有类似于其他编程语言的接口,称之为协议(protocols)
规定你在重写某个类时,哪些方法必须定义,它更像一种建议,并不是那么正式,事实上协议(protocols)更像一种指南,它告诉你,在某些情况下该去做哪些
在定制容器类型时,容器类型也需要相关的协议
如果定制出来的类型不可变,只需定义__ len__()
和 __ getitem__()
方法,比如:字符串和元组
如果定于的容器类型可变,再需要上面两种函数的基础上,还需定义__ setitem__()
和 __ deltem__()
方法
方法 | 说明 |
---|---|
__ len__(self) | 定义当len()被调用时,返回容器中元素(对象)的个数 |
__ getitem__(self,key) | 定义获取容器中指定元素的行为,相当于self[key]进行切片 |
__ setitem__(self,key,value) | 定义设置容器中元素的行为,相当于self[key] = value |
__ del__(self,key) | 定义删除容器中指定元素的行为,相当于del self[key] |
__ iter__(self,key) | 定义跌代容器中元素的行为 |
__ reversed__ (self) | 定义当被reversed()函数调用时的行为 |
__ contains__(self,item) | 定义当成员使用成员测试运算符(in 或 not in)时的行为 |
*args
作为元组传入数据class CountList(): def __init__(self,*args): #args 多参数组成的元组tuple self.values = [num for num in args] #列表表达式 返回 for - in 中间的元素,符合表达式条件的进行添加 self.count = { }.fromkeys(range(len(self.values)),0)#fromkeys的第一个参数是序列类型,每一个值都被第二个参数赋值 #访问count时返回一个字典 def __len__(self): return len(self.values) def __getitem__(self,key): #访问下标时自动调用 self.count[key] += 1 return self.values[key]>>> ls = CountList(1,2,3)>>> ls[0]1>>> ls[1]2>>> ls.count{ 0: 1, 1: 1, 2: 0}>>> ls[0] = 2Traceback (most recent call last): File "", line 1, in ls[0] = 2TypeError: 'CountList' object does not support item assignment
__ set__(self,key,vlaue)
class Clist(): def __init__(self, *args): self.values = [num for num in args] self.count = { } for i in args: self.count[i] = self.count.get(i,0) def __len__(self): return len(self.values) def __getitem__(self,key): if key >= len(self.values): print("超出索引") else: self.count[self.values[key]] = self.count.get(self.values[key],0) + 1 return self.values[key] def __setitem__(self,key,value): if key >= len(self.values): print("超出索引") else: del self.count[self.values[key]] #必须先删除要改变的元素次数,再重新进行赋值 self.values[key] = value #否则删除元素不可控 def __delitem__(self, key): if key >= len(self.values): print("超出索引") else: del self.count[self.values[key]] #先删除后需要删除计数器里的元素 del self.values[key] >>> ls = Clist(1,2,3)>>> ls[0]1>>> ls[1]2>>> ls[2]3>>> ls[3]超出索引>>> ls.count{ 1: 1, 2: 1, 3: 1}>>> ls[0] = 4>>> ls[0]4>>> ls.count{ 2: 1, 3: 1, 4: 1}
转载地址:http://wkyg.baihongyu.com/