序列协议:绑定了__getitem__方法的对象被认为是序列。 __getitem__:如果类把某个属性定义为序列,可以使用__getitem__输出序列属性中的某个元素。把绑定__getitem__()方法的实例对象称为自定义序列对象。 __setitem__:如果类把某个属性定义为序列,可以使用__setitem__修改序列属性中的某个元素。 __delitem__:如果类把某个属性定义为序列,可以使用__delitem__删除序列属性中的某个元素。
注意:类把某个属性定义为某个序列,序列是可变数据类型还是不可变数据类型,类型不同操作可能不同。
以类把某个属性定义为列表为例:
from collections import Iterable, Iterator class Test: def __init__(self, names): self.names = names def __getitem__(self, item): print("__getitem__") return self.names[item] def __setitem__(self, key, value): self.names[key] = value def __delitem__(self, key): del self.names[key] names = ["zhangsan", "lisi", "wangwu", "zhaoliu"] test = Test(names) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("++++++++++++++++++++") for name in test: print(name) print("++++++++++++++++++++") print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("++++++++++++++++++++") print(test[1]) print(test[1:3]) test[1] = "test" print(test.names) del test[1] print(test.names) print() print("***************运行原理-for...in...*******************") names = ["zhangsan", "lisi", "wangwu", "zhaoliu"] test = Test(names) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print(hasattr(test, "__iter__")) print(hasattr(test, "__next__")) print("++++++++++++++++++++") # 为test对象添加__iter__()和__next__(),解释器会在__next__()中自动调用__getitem__(), __next__()调用__getitem__()时传递的item值是个数值,表示第几次迭代。 test = iter(test) while True: try: print(next(test), end='') except StopIteration as ret: break print("++++++++++++++++++++") print(hasattr(test, "__iter__")) print(hasattr(test, "__next__")) print(isinstance(test, Iterable)) print(isinstance(test, Iterator)) print("***************运行原理-for...in...*******************") """ 运行结果: False False ++++++++++++++++++++ __getitem__ zhangsan __getitem__ lisi __getitem__ wangwu __getitem__ zhaoliu __getitem__ ++++++++++++++++++++ False False ++++++++++++++++++++ __getitem__ lisi __getitem__ ['lisi', 'wangwu'] ['zhangsan', 'test', 'wangwu', 'zhaoliu'] ['zhangsan', 'wangwu', 'zhaoliu'] ***************运行原理-for...in...******************* False False False False ++++++++++++++++++++ __getitem__ zhangsan__getitem__ lisi__getitem__ wangwu__getitem__ zhaoliu__getitem__ ++++++++++++++++++++ True True True True ***************运行原理-for...in...******************* Process finished with exit code 0 """