python:继承还是组合

python:继承还是组合,python,inheritance,composition,dictionary,Python,Inheritance,Composition,Dictionary,假设我有类,它使用了dict的一些功能。我曾经在内部合成一个dict对象,并从外部提供一些访问,但最近考虑简单地继承dict并添加一些我可能需要的属性和方法。这是一个好方法,还是我应该坚持组合?两者都很好,但我更喜欢继承,因为它意味着更少的代码(只要代码可读就好) 在Python2.2和之前的版本中,您不能直接从内置子类化,因此必须使用组合 第一个区别是不需要导入UserDict模块,因为dict是一种内置数据类型,并且始终可用。第二个是直接从dict继承,而不是从UserDict.UserD

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

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

在Python2.2和之前的版本中,您不能直接从内置子类化,因此必须使用组合

  • 第一个区别是不需要导入UserDict模块,因为dict是一种内置数据类型,并且始终可用。第二个是直接从dict继承,而不是从UserDict.UserDict继承
  • 第三个区别是微妙但重要的由于UserDict在内部的工作方式,它需要您手动调用其
    \uuuu init\uuu
    方法来正确初始化其内部数据结构
    dict
    不是这样工作的;它不是包装器,它不需要显式初始化

  • 继承权经常被滥用。除非你的类是用来作为一个具有额外功能的通用字典,否则我会说组合是一个不错的选择

    保存转发呼叫通常不是选择继承的充分理由

    从设计模式手册中:

    支持对象组合而不是类继承

    理想情况下,您不必创建 实现重用的新组件。你 应该能够得到所有的 组装所需的功能 通过对象的现有组件 作文但这种情况很少发生 情况下,因为该集可用 组件永远不够丰富 实际上。通过继承重用 使制作新组件更容易 它可以由旧的组成。 继承和对象组合 因此,共同努力

    然而,我们的经验是 设计人员过度使用继承作为 重用技术和设计经常被忽略 通过 更多取决于对象组成。”

    全文如下:

    你真的必须权衡你所做的事情的成本和范围。从
    dict
    继承是因为你想要类似字典的行为,这既快捷又简单,但容易受到限制,例如导致从类创建的对象不可损坏


    因此,例如,如果您需要序列化(即,
    pickle
    )对象,但还需要类似于字典的行为,那么显然您不能直接从
    dict
    继承,您将需要组成您希望实现的功能的部分。

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

    请记住Python非常灵活,对象组合非常好,但如果您只是将一对一映射到另一个对象对于另一个对象,继承是一种方式。我不认为它与Python的灵活性有任何关系,这是一个设计问题。如果你将一个对象的所有方法映射到另一个对象,那么你可能正在构建一个字典:使用继承。但是当最初的海报写道“我有类,它使用了dict的一些功能,它暗示了这样一个事实,即类不是用来作为字典的。类型检查有它的位置。例如,如果您有理解dict的漂亮打印机功能,您可能不希望它像dict一样打印增强对象,也不希望使用无类型检查的替代方法:monkey patching dict。
    class FileInfo(dict):                  
       "store file metadata"
       def __init__(self, filename=None): 
           self["name"] = filename