- 创建属于自己的序列
- 如果想要像操作序列那样,操作某些对象,但是原生的对象不支持容器类型的操作。这个时候就需创建自己的序列。
class User(object):
def __init__(self, id_list= None):
self.id_list = id_list
def __repr__(self):
# f"User({self.id_list})" 等同.format格式化输出效果
return f"User({self.id_list})"
def __len__(self):
# 实现__len__()方法,才能正常调用len(id_list) 可变和不可变序列都需要实现这个方法。
return len(self.id_list)
def __getitem__(self, key):
# 如果通过对象下标索引访问,key就是下标索引值
# 如果通过切片访问__getitem__()方法,key 是slice(也就是切片索引)
return self.id_list[key]
def __setitem__(self, key, value):
self.id_list[key] = value
def __delitem__(self, key):
del self.id_list[key]
def __reversed__(self):
return reversed(self.id_list)
id_list = User(id_list=["001", "002", "003"])
print(id_list) # User(['001', '002', '003'])
print(len(id_list)) # 通过实现__len__()方法解决
print(id_list[0]) # 001
通过实现__getitem__()方法解决通过下标索引访问对象元素
print(id_list[::-1]) # ['003', '002', '001']
__getitem__()方法也实现了通过切片访问
for i in id_list:
print(i, end= " ") # 001 002 003
既然是让对象实现了序列,那么也支持for循环访问对象内的元素
id_list[0] = "004" # 修改序列元素值的操作,由__setitem__()方法实现
print(id_list) # User(['004', '002', '003'])
del id_list[0] # 删除操作由__delitem__()方法实现。
print(id_list) #User(['002', '003'])
print(sorted(id_list))
虽然没有出现原生对象排序的语句,但这个方法可用 sort()方法是对原对象真实排序,如果这里使用id_list.sort(),会报错,
原因可能是没有实现对原生对象排序的方法,暂时没有搞懂,只能先这样了。