qin_yin 发表于 2020-11-11 22:54:33

容器类型

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

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

      def __getitem__(self, key):
                self.count += 1
                return self.values
以上定义了__len__方法和__getitem__方法但是还是可以修改(我的理解是可以修改的)
例:
c = Countlist(1,2,3,4)
c.value.append(5)
这样子还是修改了啊{:10_257:}

Twilight6 发表于 2020-11-11 23:10:54



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

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

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

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

kogawananari 发表于 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)就默认不会被修改了


页: [1]
查看完整版本: 容器类型