我想知道我是否有几个模型都包含“meta_keywords”或“slug”之类的字段,这些字段与将显示模型实例的网页有关,是否建议将这些页面元数据元素分开进入他们自己的类,比如PageMeta,并让我的其他模型通过多重继承继承这些模型?
1 回答
对轻度指定问题的一般建议:
Python 中非平凡的多重继承需要高级技术来处理元类/元类型冲突。从 ActiveState 档案中查看这个配方,看看它是否看起来像你喜欢的那种东西:
从链接食谱中提取:
发生元类型冲突的最简单情况如下。考虑具有元类的 A 类
M_A
和具有独立元类的 B 类M_B
;假设我们从 A 和 B 派生出 C。问题是:C 的元类是什么?是M_A
还是M_B
?正确的答案(请参阅“使元类发挥作用”一书进行深思熟虑的讨论)是
M_C
,其中M_C
是继承自M_A
和的元类M_B
。但是,Python 并不是那么神奇,它不会自动创建
M_C
. 相反,它会引发 TypeError,警告程序员可能出现的混淆。
因此,我建议将您在 Python 中使用多重继承限制在以下情况:
- 您必须这样做,因为您的问题域要求您组合两个单独维护的单继承库。
- 你已经非常流畅地使用元类型和元类,你可以像编写打印语句一样轻松自信地编写配方 204197或其等效项。
编辑:
这是Python 简介中的 Guido van Rossum :
很明显,不加选择地使用多重继承是维护的噩梦,因为 Python 依赖于约定以避免意外的名称冲突。
在这里,他再次出现在PEP 253中,它描述了融入 Python 的想法,但没有描述实现:
元类型决定了类型的各种策略 ,例如调用类型时会发生什么,动态类型如何(类型的dict在创建后是否可以修改),方法解析顺序是什么,如何查找实例属性,以及很快。
我会争辩说,当您想充分利用多重继承时,从左到右的深度优先并不是最好的解决方案。
我会争辩说,对于多重继承,子类型的元类型必须是所有基本类型的元类型的后代。
这并不意味着您不应该使用多重继承;我只是警告你,这样你就不会惊讶于有一天你会发现自己拍了拍你的额头并惊呼“D'oh!我的一个子类型的元类型不是其所有基本类型的元类型的后代!不要你不讨厌这种情况发生吗?”