我正在网上学习一个教程,代码如下:
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
对象,否则您可能违反Hands
和list
之间的is-a关系,即列表的所有方法和行为对于Hands
对象也有意义。