1

我想知道我是否有几个模型都包含“meta_keywords”或“slug”之类的字段,这些字段与将显示模型实例的网页有关,是否建议将这些页面元数据元素分开进入他们自己的类,比如PageMeta,并让我的其他模型通过多重继承继承这些模型?

4

1 回答 1

0

对轻度指定问题的一般建议:

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 中使用多重继承限制在以下情况:

  1. 您必须这样做,因为您的问题域要求您组合两个单独维护的单继承库。
  2. 你已经非常流畅地使用元类型和元类,你可以像编写打印语句一样轻松自信地编写配方 204197或其等效项。

编辑:

这是Python 简介中的 Guido van Rossum :

很明显,不加选择地使用多重继承是维护的噩梦,因为 Python 依赖于约定以避免意外的名称冲突。

在这里,他再次出现在PEP 253中,它描述了融入 Python 的想法,但没有描述实现:

元类型决定了类型的各种策略 ,例如调用类型时会发生什么,动态类型如何(类型的dict在创建后是否可以修改),方法解析顺序是什么,如何查找实例属性,以及很快。

我会争辩说,当您想充分利用多重继承时,从左到右的深度优先并不是最好的解决方案。

我会争辩说,对于多重继承,子类型的元类型必须是所有基本类型的元类型的后代。

这并不意味着您不应该使用多重继承;我只是警告你,这样你就不会惊讶于有一天你会发现自己拍了拍你的额头并惊呼“D'oh!我的一个子类型的元类型不是其所有基本类型的元类型的后代!不要你不讨厌这种情况发生吗?”

于 2009-06-18T02:01:10.403 回答