鱼C论坛

 找回密码
 立即注册
查看: 1561|回复: 6

[已解决]python怎么重载下标运算符(不知道是不是这么叫的)

[复制链接]
发表于 2020-6-17 13:51:27 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 hrp 于 2020-6-17 15:00 编辑

百度了一下都是C++的,不知道python能不能实现,对应哪个魔法方法。
PS:小甲鱼的视频教程我才看到20几集,不知道有没有讲过,我自己看的有点拖拖拉拉,别喷我

补充:就是这个 [ ]运算符,比如list1[2:5]。我定义的类的实例a,能否通过重载[]实现用a[2:5]替代a.func(2, 5)。
最佳答案
2020-6-17 16:07:23
本帖最后由 Twilight6 于 2020-7-25 10:16 编辑

class Group(object):
    """支持切片操作,实现这个协议,需要实现一下魔法函数"""
    def __init__(self, name, company, staffs):
        self.name = name
        self.company = company
        self.staffs = staffs

    def __reversed__(self):
        self.staffs.reverse()

    def __getitem__(self, item):
        """
        注意,如果是切片,item则是一个slice,如果是取值,item是一个int
        在对实例化对象进行索引,切片在这里实现对应的逻辑
        """
        import numbers
        cls = type(self)
        if isinstance(item, slice):
            return cls(name=self.name, company=self.company, staffs=self.staffs[item])
        elif isinstance(item, numbers.Integral):
            return cls(name=self.name, company=self.company, staffs=[self.staffs[item]])

    def __len__(self):
        """在对实例对象求长度"""
        return len(self.staffs)

    def __iter__(self):
        """返回一个迭代器,支持被遍历"""
        return iter(self.staffs)

    def __contains__(self, item):
        """实例对象支持in操作,"""
        if item in self.staffs:
            return True
        return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-17 13:52:27 | 显示全部楼层
什么意思.......哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 13:53:25 | 显示全部楼层
如果不会打出来至少截个图看看。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 15:02:06 From FishC Mobile | 显示全部楼层
Twilight6 发表于 2020-6-17 13:52
什么意思.......哈哈

帖子更新了,麻烦大佬看一看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-17 15:02:48 From FishC Mobile | 显示全部楼层
Hoiste 发表于 2020-6-17 13:53
如果不会打出来至少截个图看看。。

帖子更新了,麻烦大佬看一看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 15:03:06 | 显示全部楼层
hrp 发表于 2020-6-17 15:02
帖子更新了,麻烦大佬看一看


哈哈 我去试试.... 我不是大佬噻~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-17 16:07:23 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-25 10:16 编辑

class Group(object):
    """支持切片操作,实现这个协议,需要实现一下魔法函数"""
    def __init__(self, name, company, staffs):
        self.name = name
        self.company = company
        self.staffs = staffs

    def __reversed__(self):
        self.staffs.reverse()

    def __getitem__(self, item):
        """
        注意,如果是切片,item则是一个slice,如果是取值,item是一个int
        在对实例化对象进行索引,切片在这里实现对应的逻辑
        """
        import numbers
        cls = type(self)
        if isinstance(item, slice):
            return cls(name=self.name, company=self.company, staffs=self.staffs[item])
        elif isinstance(item, numbers.Integral):
            return cls(name=self.name, company=self.company, staffs=[self.staffs[item]])

    def __len__(self):
        """在对实例对象求长度"""
        return len(self.staffs)

    def __iter__(self):
        """返回一个迭代器,支持被遍历"""
        return iter(self.staffs)

    def __contains__(self, item):
        """实例对象支持in操作,"""
        if item in self.staffs:
            return True
        return False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 15:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表