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和之前的版本中,您不能直接从内置子类化,因此必须使用组合
\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