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

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())

它基本上模拟了一个有很多骰子(size)的玩家,以及他们拿着什么骰子(die_class)。
我的困惑是为什么我们需要打电话给super().__init__?我试着运行没有它的代码,它工作得很好!为什么要打电话?

最佳答案

如果基类要确保运行任何初始化代码,则需要调用__init__()。如果没有那个调用,它(似乎)就可以工作,这可能是一个巧合,或者您可能还没有碰到结果问题。即使它在当前使用的Python版本和实现中工作一致,也不能保证其他版本和实现在不调用基类“__init__方法的情况下工作。
此外,您还可以实际使用该调用用骰子对象填充列表:

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_class重命名为die_factory,因为生成新模具对象的任何可调用项都可以在这里使用。
注意:除非Hands对象实际上是list对象,否则您可能违反Handslist之间的is-a关系,即列表的所有方法和行为对于Hands对象也有意义。

08-16 17:23