其他分享
首页 > 其他分享> > 自制可切片对象

自制可切片对象

作者:互联网

切片也是一种类型,叫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