gpt4 book ai didi

python - 在 python 上子类化列表

转载 作者:行者123 更新时间:2023-11-28 18:19:13 25 4
gpt4 key购买 nike

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

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

它基本上模拟了一个拥有多个骰子(大小)的玩家以及他们持有的骰子(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,因为可以在此处使用任何可生成新 die 对象的可调用对象。

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

关于python - 在 python 上子类化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46324470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com