|

楼主 |
发表于 2018-11-7 08:48:53
|
显示全部楼层
本帖最后由 BigSmall 于 2018-11-7 19:56 编辑
48
定制容器
协议:一种指南
诸如列表、元组和字典,这些都是容器,里面存放各种各样的对象
容器类型的协议:
如果你定制的容器不可变,如元组、字符串,你只需要定义__len__()和__getitem__()方法
如果你希望定制的容器是可变的,除了上述两种方法外,还需要定义__setitem__()和__delitem__()方法
容器类型的魔法方法
__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)时的行为
练习:编写一个不可改变的自定义列表,要求记录列表中每个元素被访问的次数
准备:1.*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)
def foo(x,*args):
print(x)
print(args)
foo(1,2,3,4,5) #其中的2,3,4,5都给了args
1
(2, 3, 4, 5) #这里args其实是一个元组
2.列表推导式提供了一种创建list的简便方法。应用程序创建列表时,列表中的元素来源于其他序列、可迭代对象或创建的一个满足一定条件的序列。
self.values=[x for x in args] #其实就是创建了elf.values这个列表,列表里面的元素是x,x是for循环遍历元组args
3.统计每个元素被访问的次数,最先想到的是什么,是字典,将这个列表的下标作为这个字典的键,它的值就是它对应的访问次数
4.字典的创建:{}.fromkeys(包含键的列表,键的初值)
5.range(3)就是创建一个列表[0,1,2]
|
|