一文搞懂__len__
,__getitem__
,__setitem__
,__delitem__
基本的序列和映射协议
序列和映射基本上是元素(item)的集合,要实现它们的基本行为(协议),不可变对象需要实现2个方法,而可变对象需要实现4个。
__len__(self)
:这个方法应返回集合包含的项数,对序列来说为元素个数,对映射来说为键-值对数。如果__len__
返回零(且没有实现覆盖这种行为的__nonzero__
),对象在布尔上下文中将被视为假(就像空的列表、元组、字符串和字典一样)。
__getitem__(self, key)
:这个方法应返回与指定键相关联的值。对序列来说,键应该是0~n-1的整数(也可以是负数),其中n为序列的长度。对映射来说,键可以是任何类型。
__setitem__(self, key,value)
:这个方法应以与键相关联的方式存储值,以便以后能够使用__getitem__
来获取。当然,仅当对象可变时才需要实现这个方法。
__delitem__(self, key)
:这个方法在对对象的组成部分使用__del__
语句时被调用,应删除与key相关联的值。同样,**仅当对象可变(且允许其项被删除)**时,才需要实现这个方法
class Student:
def __init__(self, name, age):
self.name = name
self.age = age
self.info = {name: age}
def __getitem__(self, item):
return self.info[item]
def __setitem__(self, key, value):
self.info[key] = value
def __len__(self):
return len(self.info)
def __delitem__(self, key):
del self.info[key]
# 实例化对象
s = Student('zhangsan', 18)
# 这个打印意思是当碰上这种形式自动去寻找__getitem__方法,并将参数传入返回结果
print(s['zhangsan']) # 18
# 当碰上这种写法,那么会自动去寻找__setitem__方法,并设置
s['lisi'] = 19
# 此时打印结果已经增加了我们设置的数据
print(s.info) # {'zhangsan': 18, 'lisi': 19}
# 当碰上这种写法,那么会自动去寻找__len__方法,并返回结果
print(len(s)) # 2
# 当碰上这种写法,那么会自动去寻找__delitem__方法
del s['lisi']
# 此时打印结果数据已经删除了
print(len(s)) # 1
语言是平白的,但是没有语言也很难理解,所以代码里面我已经做了分析,以及实现的原理,希望能够多看几遍,其实不难。还有一点我还要重点强调一遍不可变对象可以实现2个方法,而可变对象可以实现4个。
好了,今天就到这里吧,希望对大家都有所帮助