前面的魔术方法可以把实例对象能够伪装的像一个容器,像一个列表或者集合,如何像这些东西,其实只要靠魔术方法就可以了,这几个魔术方法非常重要
这个是>=0的整数,如果没有bool方法,则会看长度,0就是false
如果有bool方法了,长度是几就是几
容器时用来放一个个元素的,把数据放在一起
需要拿数据,就需要遍历,或者key,遍历就需要有一个可迭代对象
用这个方法可以把一个类转换成一个容器,而且是个可迭代对象
如果没实现,则调用__iter__,没有,不遍历怎么知道在不在,判断一个元素在不在就需要做遍历
找其中一个元素,非常重要,对于序列对象,key是索引
对于set和dict,key就是作为可以hash的,key不存在引发keyerror
这个就是一种方法都可以操作,字典,列表
a[k]会调用getitem,找不到会__missing__
注释掉就是经常遇到的东西了
这样找不到key,不会报keyerror,找不到给缺省值
getitem找不到,key,执行该方法
空字典等效false就是因为下面这个,元素个数为0等效false
是否可以把购物车改成一个容器类
假如封装什么不想告诉你
但是人家使用的就关心购物车有什么长度,所有内部调用的还是len(sellf.__items)
cart如果要迭代需要加一个__iter__方法
这样告诉你iter你return了一个非迭代的东西
这样就转换成了一个可迭代东西
加一个4
能不能使用yield,yield出一个值,一个值被print,把列表作为一个整体yield出去,这里就只能迭代一次
使用yield from
一般购物车其实可以没有顺序的,现在是把列表的操作转成实例的操作
那么能不能用索引号来取,对应索引号的商品
python的列表索引应该是正数,负整数,不支持字符串,但是现在’‘2’'字符串,传进去就不带引号
为了好理解改成index
拿你包装的容器拿一项,把索引传入进来到容器力拿
如果要对某一项进行修改
能否打印2是否在里面
这么写,问一个值有没有在列表中还需要去找
就这么当容器用即可
像pathlib里的path类都可以接字符串这么玩,实现一下add做运算符重载
如何实现连加,等效__add__(),add()
add方法返回实例,可以继续用add方法
这就是不断往购物车放东西,这种连续的叫链式编程
这就是容器的相关方法
如果要把类变成容器,就需要这么做
add实现连加