假设我有class
,它使用 的某些功能dict
。我曾经在内部合成一个dict
对象并提供一些来自外部的访问,但最近考虑简单地继承dict
和添加一些我可能需要的属性和方法。这是一个好方法,还是我应该坚持作文?
4 回答
继承权经常被滥用。除非您的课程旨在用作具有额外功能的通用字典,否则我会说组合是要走的路。
保存转发调用通常不是选择继承的充分理由。
来自设计模式书:
优先使用对象组合而不是类继承
理想情况下,您不必创建新组件来实现重用。通过对象组合组装现有组件,您应该能够获得所需的所有功能。但这种情况很少发生,因为在实践中可用组件的集合永远不够丰富。通过继承重用可以更容易地制作可以与旧组件组合的新组件。继承和对象组合因此一起工作。
尽管如此,我们的经验是,设计师过度使用继承作为一种重用技术,并且设计通常通过更多地依赖对象组合而变得更加可重用(和更简单)。”
两者都很好,但我更喜欢继承,因为这意味着更少的代码(只要它是可读的,这总是好的)。
在 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
不能这样工作;它不是包装器,也不需要显式初始化。
你真的必须权衡你想要做的事情的成本和范围。继承 fromdict
因为你想要类似字典的行为是快速和容易的,但容易受到限制,例如导致从你的类创建的对象是不可散列的。
因此,例如,如果您需要序列化(即pickle
)对象,但还需要类似字典的行为,那么显然您不能直接继承dict
,您需要组合您想要的功能部分做到这一点。
应该isinstance(my_object, dict)
返回 True 还是 False?换句话说,如果您不小心将其中一个对象交给了想要 a 的东西,dict
它是否应该愉快地尝试将其用作 a dict
?可能不是,所以使用组合。