鱼C论坛

 找回密码
 立即注册
查看: 1766|回复: 2

[已解决]容器类型

[复制链接]
发表于 2020-11-11 22:54:33 | 显示全部楼层 |阅读模式

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

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

x
小甲鱼说定义一个不可变类型,只需要定义__len__(self),和__getitem__()方法.
class CountList:
        def __init__(self, *args):
                self.values = [x for x in args]
                self.count = {}.fromkeys(range(len(self.values)), 0)

        def __len__(self):
                return len(self.values)

        def __getitem__(self, key):
                self.count[key] += 1
                return self.values[key]
以上定义了__len__方法和__getitem__方法但是还是可以修改(我的理解是可以修改的)
例:
c = Countlist(1,2,3,4)
c.value.append(5)
这样子还是修改了啊
最佳答案
2020-11-11 23:10:54


这里确实不是那么严谨哈,甲鱼哥所说不可变列表的意思是列表内已有元素的值不可变

比如对容器的第一个元素重新赋值:c[1] = 100 就会发现有报错

不是指的像元组一样不能添加元素,不能删除元素,所以你理解没错哈~

Ps:你举例子时候代码也要认真检查下哈,CountList 你的 L 是小写的、c.values 你少了 s 哈

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-11 23:10:54 | 显示全部楼层    本楼为最佳答案   


这里确实不是那么严谨哈,甲鱼哥所说不可变列表的意思是列表内已有元素的值不可变

比如对容器的第一个元素重新赋值:c[1] = 100 就会发现有报错

不是指的像元组一样不能添加元素,不能删除元素,所以你理解没错哈~

Ps:你举例子时候代码也要认真检查下哈,CountList 你的 L 是小写的、c.values 你少了 s 哈

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-11 23:46:16 | 显示全部楼层
你这个只是只读且可变的序列(再改改__contains__和 __reversed__也要实现的就能继承到typing.Sequence泛型)

不可变类型还需要重写__hash__ 和__eq__(typing.Hashable泛型)

最终效果就是
c = CountList(1,2,3,4)
b = CountList(1,2,3,4)

c==b #True
hash(c)==hash(b) #True

再就是values和count你注册成属性描述符(@property)就默认不会被修改了


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-17 22:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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