【问题标题】:Subclassing a list on python在python上子类化一个列表
【发布时间】:2017-09-20 14:14:25
【问题描述】:

我正在网上学习一个教程,代码是这样的:

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__?我尝试在没有它的情况下运行代码,它运行良好!为什么需要调用?

【问题讨论】:

标签: python list super


【解决方案1】:

如果基类需要调用__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,即all 列表的方法和行为也适用于Hands 对象。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-25
      • 2021-05-09
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      相关资源
      最近更新 更多