eug*_*ene 7 python inheritance composition mixins
我理解mixin看起来像继承,但更像是组合.
(编辑:我倾向于giving additional functionality/attributes通过mixin 思考而不是giving another is-a relationship.)在
心理上,当我使用mixin时,我说的是这样的东西:我给你这个你缺少的mixin,而不是你实际上也是这个mixin-type. (IS-A)
我读了几遍,你应该更喜欢作文而不是继承.
我们可以使用直接的成分而不是mixins,什么是mixin?
如果我不得不猜测,那是因为my_instance.foo()比my_instance.another_instance.foo()更容易吗?
(如果mixin有foo(),你可以使用my_instance.foo(),当你将another_instance复合为my_instance的属性时,你需要my_instance.another_instance.foo()
还有其他原因吗?
编辑:
所以即使我觉得它有一个-a,但mixin仍然是一种关系.当你使用is-a时,你得到的好处是更清洁的界面.那就是我如何理解德尔南的答案.
小智 8
(因为mixin不会给你一个关系,它给你一个-a)
错,它确实给你一个is-a关系.考虑class C(A, B).issubclass(C, A)是的,也是如此issubclass(C, B).C().method_of_B()如果它没有在MRO中的某个地方被覆盖,那么该调用将调用B的方法(这也可能发生在单继承中!),并且类似于方法A.属性访问C().attr_of_{a,b}为您提供属性A或B太多(与方法相同的警告).
我读了几遍,你应该更喜欢作文而不是继承.
这种经验法则的存在是因为许多人倾向于在不适当的地方使用继承,而不是因为继承在任何情况下都不是一个有用的工具.这也适用于Python.常见(好)原因包括:
super().如果我不得不猜测,那是因为my_instance.foo()比my_instance.another_instance.foo()更容易吗?
这只是一些额外的角色.更重要的是,您必须为要重新导出的每个方法重新键入包装器方法(如果您通过组合模拟is-a关系,则所有这些方法都是如此).
从概念上讲,这个手工工作似乎毫无意义且容易出错,如果C真的是-a A.Mixins/multiple inheritance支持一个对象超过单个bass类可以或应该表示的对象的情况.例如,UTF-8字符串可以是a ByteBuffer和a UnicodeStream.通常,我们有这样的接口(或者不是;在Python中这是隐式的),但mixins还允许以可组合和方便的方式添加相关的功能.