序列的定制一般包含有的魔法方法
-
len(self) 定义当被len()调用时的行为(返回容器中的元素个数)
-
getitem(self,key) 定义获取容器中制定元素的行为,相当于self[key]
-
setitem(self,key,value) 定义获取容器中制定元素的行为,相当于self[key] = value
-
delitem(self,key) 定义删除容器中指定元素的行为,相当于del self[key]
-
iter(self) 定义迭代器中的元素行为
-
reversed(self) 定义当reversed()调用时的行为
-
contains(self,item) 定义当使用成员,测试运算符(in 或 not in)的行为
容器类型的协议
- 如果说你希望定制的容器是不可变的话,你只需要定义len(self)和getitem(self,key)
- 如果说你希望定制的容器是可变的话,除了len(self)和getitem(self,key)方法外,你还需要定义setitem(self,key,value)和delitem(self,key)
定义一个不可变的容器,记录里面元素被访问的次数
class CapList():
def __init__(self,*args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)),0)
def __len__(self):
return len(self.values)
def __getitem__(self,key):
self.count[key] += 1
return self.values[key]
c = CapList(1,2,3,4,5)
c[1]
2
c.count
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0}
网友评论