python:继承或组合

时间:2010-03-05 20:44:22

标签: python inheritance composition dictionary

假设我class使用dict的某些功能。我曾经在里面组合了一个dict对象,并提供了一些来自外部的访问,但最近想过简单地继承dict并添加一些我可能需要的属性和方法。这是一个好的方式,还是我应该坚持作曲?

4 个答案:

答案 0 :(得分:13)

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

保存转发呼叫通常不足以成为选择继承的理由。

来自设计模式书:

  

赞成对象组合而不是类继承

     

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

     

尽管如此,我们的经验是这样的   设计师过度使用继承作为   经常使用重用技术和设计   使得更多可重用(和更简单)   更多地取决于对象的构成。“

整个文字在这里: http://blog.platinumsolutions.com/node/129

答案 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
     
      
  1. 第一个区别是您不需要导入UserDict模块,因为dict是内置数据类型并且始终可用。第二个是你直接从dict继承,而不是从UserDict.UserDict继承。
  2.   
  3. 第三个区别是微妙但重要。 由于UserDict在内部的工作方式,它要求您手动调用其__init__方法以正确初始化其内部数据结构dict不能像这样工作;它不是包装器,它不需要显式初始化
  4.   

答案 2 :(得分:3)

你真的必须权衡你想要做的事情的成本和范围。继承自dict,因为您希望类似字典的行为快速而简单,但容易受到限制,例如导致从您的类创建的对象不可用。

因此,例如,如果您需要序列化(即pickle)对象,但也需要类似字典的行为,那么显然您无法直接从dict继承并且您我需要编写你希望实现这一功能的部分功能。

答案 3 :(得分:3)

isinstance(my_object, dict)应该返回True还是False?换句话说,如果您不小心将某个对象提供给需要dict的对象,那么它是否应该轻易地将其用作dict?可能不是,所以使用构图。