假设我class
使用dict
的某些功能。我曾经在里面组合了一个dict
对象,并提供了一些来自外部的访问,但最近想过简单地继承dict
并添加一些我可能需要的属性和方法。这是一个好的方式,还是我应该坚持作曲?
答案 0 :(得分:13)
继承经常被滥用。除非你的类被用作具有额外功能的通用字典,否则我会说组合是要走的路。
保存转发呼叫通常不足以成为选择继承的理由。
来自设计模式书:
赞成对象组合而不是类继承
理想情况下,您不必创建 新组件实现重用。您 应该能够得到所有的 组装所需的功能 现有组件通过对象 组成。但这很少见 情况,因为可用的一套 组件永远不够丰富 在实践中。通过继承重用 使制作新组件变得更容易 可以用旧的组成。 继承和对象组成 因此一起工作。
尽管如此,我们的经验是这样的 设计师过度使用继承作为 经常使用重用技术和设计 使得更多可重用(和更简单) 更多地取决于对象的构成。“
答案 1 :(得分:3)
两者都很好,但我更喜欢继承,因为它意味着更少的代码(只要它是可读的,它总是好的。)
Dive into Python has a very relevant example
在Python 2.2及之前的版本中,您无法直接从内置类中继承子类,因此 使用合成。
class FileInfo(dict): "store file metadata" def __init__(self, filename=None): self["name"] = filename
- 第一个区别是您不需要导入UserDict模块,因为dict是内置数据类型并且始终可用。第二个是你直接从dict继承,而不是从UserDict.UserDict继承。
- 第三个区别是微妙但重要。 由于UserDict在内部的工作方式,它要求您手动调用其
醇>__init__
方法以正确初始化其内部数据结构。dict
不能像这样工作;它不是包装器,它不需要显式初始化。
答案 2 :(得分:3)
你真的必须权衡你想要做的事情的成本和范围。继承自dict
,因为您希望类似字典的行为快速而简单,但容易受到限制,例如导致从您的类创建的对象不可用。
因此,例如,如果您需要序列化(即pickle
)对象,但也需要类似字典的行为,那么显然您无法直接从dict
继承并且您我需要编写你希望实现这一功能的部分功能。
答案 3 :(得分:3)
isinstance(my_object, dict)
应该返回True还是False?换句话说,如果您不小心将某个对象提供给需要dict
的对象,那么它是否应该轻易地将其用作dict
?可能不是,所以使用构图。