在python上对列表进行子类化
我正在网上学习一个教程,代码如下:在python上对列表进行子类化,python,list,super,Python,List,Super,我正在网上学习一个教程,代码如下: 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):
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())
它基本上模拟了一个拥有大量骰子(大小
)的玩家以及他们持有的骰子(骰子等级
)
我的困惑是为什么我们需要调用
super()?我试着在没有它的情况下运行代码,结果很好!为什么需要调用?super()
可以避免显式引用基类。更重要的是,通过多重继承,您可以执行以下操作。在一天结束时,这是不必要的,这只是一种良好的实践。如果基类运行,则需要调用\uuuu init\uuuu()
。它(似乎)在没有那个电话的情况下工作可能是巧合,或者你可能只是还没有解决由此产生的问题。即使它在当前使用的Python版本和实现中保持一致,也不能保证其他版本和实现在不调用基类“\uuuu init\uuu
方法的情况下工作
此外,您还可以使用该调用使用骰子对象填充列表:
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_类
重命名为die_工厂
,因为这里可以使用任何生成新die对象的可调用对象
注意:除非Hands
对象实际上是list
,否则您可能会在此处违反Hands
和list
之间的is-a关系,即列表的所有方法和行为也对Hands
对象有意义。即使它现在可以工作,因为list
似乎不需要默认构造函数,如果下一个python版本要求在列表
对象上调用\uuuu init\uuuu
,该怎么办?为什么不调用\uuuuu init\uuuuuu
?这不是必要的(但这是一种很好的做法),因为我认为它违反了Liskov原则。它能用,好吧,但什么时候会坏?可能是