python - 实现代表“带有标题的列表”的类的pythonic方法是什么?
问题描述
我试图更好地理解 python 中的组合与继承,所以我制作了一个有希望的简单示例。
假设我想实现一个类,该类TitledList
的行为类似于标准列表,但具有一个附加属性title
,用于保存包含列表名称的字符串。和方法可能必须重新实现以合并标题__repr__
,__str__
但否则我想保留list
. 初始化程序将接受可选的仅限关键字参数title
。
我可以看到创建此类的两种方法。我可以走组合路线,并定义一个具有两个属性的类,.contents
(常规列表)和.title
. 这大概看起来像
class TitledList:
def __init__(self, contents=[], *, title=None):
self.contents = list(contents)
self.title = title
但是我不确定我将如何去抄袭所有的方法,list
所以我不必不断地到处引用my_titled_list.contents
或重新实现我使用的所有列表方法。
另一种选择是做整个互联网上每个人都说 不做 的 事情,并从list
类继承。我想在那种情况下我会做这样的初始化程序吗?
class TitledList(list):
def __init__(self, iterable=[], *, title=None):
super().__init__(iterable)
self.title = title
这对我来说似乎更直接。但肯定整个互联网上的每个人都说不要扩展list
是有原因的。
这里有什么优点和缺点?有没有一种简单的方法可以让组合解决方案按照我直觉想要的方式工作?继承解决方案有很多我不理解的缺点吗?我应该考虑第三种选择吗(UserList
?)
解决方案
有几种方法可以做到这一点。
子类
collections.UserList
而不是list
. 这基本上是一个list
设计为可扩展的包装器。子类
collections.abc.MutableSequence
化并实现所有必需的抽象方法。如果您想定义一个全新的类似序列的类,这可能很有用。子类
list
。在像您的示例这样的有限场景中,这实际上可能很好TitledList
,您只是添加一个新属性。但是,如果您想覆盖 ovverridelist
的现有方法,那么这可能不是一个好主意。创建一个具有列表属性的新对象。这简单易懂,但可能不方便。这完全取决于您的用例。
推荐阅读
- mysql - mysql - 在一个查询中计算空字段和非空字段
- react-native - 打包js文件插入到React Native的WebView中
- javascript - 为什么 setTimeout 在循环中只打印一次?
- c++ - 如何在 C++ 中将 MOD 运算符的 double 值转换为 Int 值?
- architecture - 如何将与数据库关联的一个后端服务解耦为两个独立的服务?
- c++ - 如何正确使用可变参数模板函数
- constants - ESlint 错误:在 Brakets ide 中保留了 const 关键字
- javascript - 在 Javascript 中单击 div 后如何在 div 中显示内容?
- java - Java Swing中的JTable不释放内存(字符串被大量使用)
- mongodb - 如何连接到远程MongoDB服务器