自制可切片对象
作者:互联网
切片也是一种类型,叫slice。而切片一般是在__getitem__里完成的
例如判断某个对象obt是否为切片类型,一般使用isinstance(obt,slice)
而切片对象一般是包含中括号[]和冒号:的,例如obt = [0:3]
但要注意区分[数字]和[数字:数字],前者是单个索引值,后者才是切片
案例说明
创建一个公司类,实例属性有com_name(公司名)和staffs(列表存员工名)
注意:是直接对对象进行外部的切片等操作,而在内部则是对对象里的某个属性进行操作
要求:
1、可对对象直接进行切片操作,并返回一个新对象,对原对象不做改动,且即使是对对象进行索引,返回的也是新对象
2、实现列表反序方法
3、实现成员运算符检查某元素是否在对象里 即 显示调用if in时,要在类里实现__contains__魔法函数
4、对象为可迭代对象,且用for循环遍历对象时,输出列表staffs的元素,需实现__iter__
class Company():
def __init__(self,com_name,staffs):
self.com_name = com_name
self.staffs = staffs
# 切片或是索引操作
def __getitem__(self,item):
cls = type(self)
if isinstance(item,slice):
return cls(self.com_name,self.staffs[item])
# 如果是对对象索引,那么返回的对象staffs属性依旧是列表类型,因此是[self.staffs[item]]
elif isinstance(item,int):
return cls(self.com_name,[self.staffs[item]])
def __contains__(self, item):
# 外部是对对象进行in判断,而内部则转化为对列表元素是否存在的判读
if item in self.staffs:
return True
else:
return False
# for循环遍历输出列表元素
def __iter__(self):
return iter(self.staffs)
staffs = list("赵钱孙李周吴郑王")
com1 = Company("com1",staffs)
# 对对象进行切片
new_com1 = com1[2:4]
print(new_com1.staffs)
iter(new_com1)
print(next(new_com1))
# 如果没有__iter__魔法函数,但有__getitem__,对象也是可迭代的,只是迭代返回的cls创建的新对象。要通过i.staffs才能拿到单个值
# 有了iter函数,并通过返回iter(self.staffs),对列表进行迭代,则for循环输出的是列表里的单个元素
# 因此,当使用for循环遍历时,程序会先找__iter__魔法函数,再找__getitem__函数
for i in new_com1:
print(i)
1、 如果没有__iter__
魔法函数,但有__getitem__
,对象也是可迭代的,只是迭代返回的cls创建的新对象。要通过i.staffs才能拿到单个值
2、有了iter函数,并通过返回iter(self.staffs)
,对列表进行迭代,则for循环输出的是列表里的单个元素
3、因此,当使用for循环遍历时,程序会先找__iter__
魔法函数,再找__getitem__
函数
标签:__,对象,自制,iter,切片,item,staffs,self 来源: https://blog.csdn.net/weixin_50348308/article/details/123592301