在python上对列表进行子类化

时间:2017-09-20 14:14:26

标签: python list super

我在网上关注教程,代码如下:

XmlReadMode.Auto

它基本上模拟了一个具有多个骰子(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?我尝试没有它运行代码,它工作正常!为什么要打电话?

2 个答案:

答案 0 :(得分:2)

如果基类要确保运行任何初始化代码,则需要调用__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,因为此处可以使用任何生成新骰子对象的可调用对象。

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

答案 1 :(得分:-1)

super()可以避免显式引用基类。更重要的是,通过多重继承,您可以执行this之类的操作。在一天结束时,没有必要,这只是一种很好的做法。