容器相关魔术方法

  

  • __len__
    内建函数len(),返回对象的长度(>=0),把对象当作容器类型看,如同list或dict,bool()函数调用的时候,如果没有__bool__()方法,则会看__len__()方法是否存在,存在返回非0为真
  • __iter__ 迭代容器时调用,返回一个新的迭代器对象
  • __containers__     in成员运算符,没有实现,就调用__iter__()方法遍历
  • __getitem__      实现self[key]访问,序列对象,key接受整数为索引,或者切片,对于set/dict,key为hashable,   key不存在引发KeyError异常
  • __setitem__        和__getitem__类似,设置值的方法
  • __misssing__     字典使用__getitem__()调用时,key不存在执行

 

class Item:
    def __init__(self,name,**kwargs):
        self.name=name
        self._spec=kwargs
    def __repr__(self):
        return '{} : {}'.format(self.name,self._spec)

class Cart:
    def __init__(self):
        self.items=[]

    def __len__(self):
        return len(self.items)

    def additem(self,item):
        self.items.append(item)
        return True

    def __repr__(self):
        return 'cart: {}'.format(self.items)

    def __add__(self,other):
        print(other)
        # if isinstance(other,Item):
        self.items.append(other)
        return self
    def __iter__(self):
        return iter(self.items)

    def __getitem__(self,item):
        return self.items[item]

    def __missing__(self,key): # dict/set key missing
        print(key)

    def __setitem__(self,key,value):
        self.items[key]=value

cart=Cart()
print(cart+2+3+5)
# print(len(cart))

# for b in cart: # 本质上调用next()
#     print(b)
cart[1]=777
print(cart[1])
print(2 in cart)

 

posted @ 2020-10-06 01:09  ascertain  阅读(107)  评论(0编辑  收藏  举报