gpt4 book ai didi

python - 实现表示 "a list with a title"的类的 pythonic 方法是什么?

转载 作者:行者123 更新时间:2023-12-01 00:22:54 24 4
gpt4 key购买 nike

我试图更好地理解 python 中的组合与继承,因此我制作了一个希望简单的示例。

假设我想实现一个类 TitledList ,其行为就像标准列表一样,但具有一个附加属性 title 旨在保存包含名称的字符串列表中的。 __repr____str__ 方法可能需要重新实现才能合并标题,但除此之外,我想保留 list 的所有 native 功能>。初始化器将接受可选的仅关键字参数title

我可以看到创建此类的两种方法。我可以走组合路线,定义一个具有两个属性的类:.contents(常规列表)和.title。这大概看起来类似于

class TitledList:
def __init__(self, contents=[], *, title=None):
self.contents = list(contents)
self.title = title

但我不确定如何抄袭 list 的所有方法,这样我就不必不断地引用 my_titled_list.contents 了放置或重新实现我使用的所有列表方法。

另一种选择是做整个互联网上每个人都做的事情says not to do ,并继承自 list 类。我想在那种情况下我会像这样做初始化程序?

class TitledList(list):
def __init__(self, iterable=[], *, title=None):
super().__init__(iterable)
self.title = title

这对我来说似乎更简单。但肯定整个互联网上的每个人都说不要出于某种原因扩展 list

这里有什么优点和缺点?有没有一种简单的方法可以使合成解决方案按照我直观想要的方式工作?继承解决方案是否有很多我不明白的缺点?我是否应该考虑第三种选择(UserList?)

最佳答案

有多种方法可以做到这一点。

  1. 子类 collections.UserList而不是列表。这基本上是一个围绕 list 的包装器,旨在可扩展。

  2. 子类 collections.abc.MutableSequence并实现所有必需的抽象方法。如果您想定义一个全新的类似序列的类,这可能很有用。

  3. 子类列表。在有限的场景中,这实际上可能没问题,例如您的 TitledList 示例,您只需添加一个新属性。但如果您想覆盖 list 的现有方法,那么这可能不是一个好主意。

  4. 创建一个具有列表属性的新对象。这很简单且易于理解,但可能会带来不便。这完全取决于您的用例。

引用:Trey Hunner: The problem with inheriting from dict and list in Python

关于python - 实现表示 "a list with a title"的类的 pythonic 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58831514/

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