在python上对列表进行子类化

在python上对列表进行子类化,python,list,super,Python,List,Super,我正在网上学习一个教程,代码如下: class Hands(list): def __init__(self, size=0, die_class=None, *args, **kwargs): if not die_class: raise ValueError("You must provide a die class") super().__init__() for _ in range(size):

我正在网上学习一个教程,代码如下:

class Hands(list):
    def __init__(self, size=0, die_class=None, *args, **kwargs):
        if not die_class:
            raise ValueError("You must provide a die class")
        super().__init__()

        for _ in range(size):
            self.append(die_class())
它基本上模拟了一个拥有大量骰子(
大小
)的玩家以及他们持有的骰子(
骰子等级


我的困惑是为什么我们需要调用
super()?我试着在没有它的情况下运行代码,结果很好!为什么需要调用?

super()
可以避免显式引用基类。更重要的是,通过多重继承,您可以执行以下操作。在一天结束时,这是不必要的,这只是一种良好的实践。

如果基类运行,则需要调用
\uuuu init\uuuu()
。它(似乎)在没有那个电话的情况下工作可能是巧合,或者你可能只是还没有解决由此产生的问题。即使它在当前使用的Python版本和实现中保持一致,也不能保证其他版本和实现在不调用基类“
\uuuu init\uuu
方法的情况下工作

此外,您还可以使用该调用使用骰子对象填充列表:

class Hands(list):
    def __init__(self, size=0, die_factory=None):
        if not die_factory:
            raise ValueError('You must provide a die factory')
        super().__init__(die_factory() for _ in range(size))
我已经将
die_类
重命名为
die_工厂
,因为这里可以使用任何生成新die对象的可调用对象


注意:除非
Hands
对象实际上是
list
,否则您可能会在此处违反
Hands
list
之间的is-a关系,即列表的所有方法和行为也对
Hands
对象有意义。

即使它现在可以工作,因为
list
似乎不需要默认构造函数,如果下一个python版本要求在
列表
对象上调用
\uuuu init\uuuu
,该怎么办?为什么不调用
\uuuuu init\uuuuuu
?这不是必要的(但这是一种很好的做法),因为我认为它违反了Liskov原则。它能用,好吧,但什么时候会坏?可能是