15

假设我有class,它使用 的某些功能dict。我曾经在内部合成一个dict对象并提供一些来自外部的访问,但最近考虑简单地继承dict和添加一些我可能需要的属性和方法。这是一个好方法,还是我应该坚持作文?

4

4 回答 4

14

继承权经常被滥用。除非您的课程旨在用作具有额外功能的通用字典,否则我会说组合是要走的路。

保存转发调用通常不是选择继承的充分理由。

来自设计模式书:

优先使用对象组合而不是类继承

理想情况下,您不必创建新组件来实现重用。通过对象组合组装现有组件,您应该能够获得所需的所有功能。但这种情况很少发生,因为在实践中可用组件的集合永远不够丰富。通过继承重用可以更容易地制作可以与旧组件组合的新组件。继承和对象组合因此一起工作。

尽管如此,我们的经验是,设计师过度使用继承作为一种重用技术,并且设计通常通过更多地依赖对象组合而变得更加可重用(和更简单)。”

全文在这里: http ://blog.platinumsolutions.com/node/129

于 2010-03-05T20:57:40.403 回答
3

两者都很好,但我更喜欢继承,因为这意味着更少的代码(只要它是可读的,这总是好的)。

Dive into Python 有一个非常相关的例子

在 Python 2.2 和之前的版本中,您不能直接从内置函数中继承子类,因此您必须使用组合。

class FileInfo(dict):                  
   "store file metadata"
   def __init__(self, filename=None): 
       self["name"] = filename
  1. 第一个区别是您不需要导入 UserDict 模块,因为 dict 是内置数据类型并且始终可用。第二个是您直接从 dict 继承,而不是从 UserDict.UserDict 继承。
  2. 第三个区别是微妙但重要的。由于 UserDict 内部工作的方式,它需要您手动调用其__init__方法以正确初始化其内部数据结构dict不能这样工作;它不是包装器,也不需要显式初始化
于 2010-03-05T20:49:37.347 回答
3

你真的必须权衡你想要做的事情的成本和范围。继承 fromdict因为你想要类似字典的行为是快速和容易的,但容易受到限制,例如导致从你的类创建的对象是不可散列的。

因此,例如,如果您需要序列化(即pickle)对象,但还需要类似字典的行为,那么显然您不能直接继承dict,您需要组合您想要的功能部分做到这一点。

于 2010-03-05T21:05:36.307 回答
3

应该isinstance(my_object, dict)返回 True 还是 False?换句话说,如果您不小心将其中一个对象交给了想要 a 的东西,dict它是否应该愉快地尝试将其用作 a dict?可能不是,所以使用组合。

于 2010-03-05T21:34:06.877 回答