提取页面元数据是否可以很好地利用多重继承?

时间:2009-06-18 01:26:59

标签: python django architecture multiple-inheritance mixins

我想知道我是否有几个模型都包含像“meta_keywords”或“slug”这样的字段,这些字段与将要显示模型实例的网页有关,是否建议打破这些页面将元数据元素放到他们自己的类中,比如说PageMeta,让我的其他模型通过多重继承对它们进行子类化?

1 个答案:

答案 0 :(得分:0)

一个轻微指定问题的一般建议:

Python中的非平凡多重继承需要Advanced Techniques来处理元类/元类型冲突。从ActiveState档案中查看this recipe,看看它是否与您喜欢的类似:

从链接食谱中提取:

  

最简单的情况是元型   发生冲突的是以下几点。   考虑具有元类M_A的A类   和一个独立的B级   元类M_B;假设我们得到C   来自A和B.问题是:什么是   C的元类?是M_A还是M_B   ?

     

正确的答案(见书   “让元类工作”   深思熟虑的讨论)是M_C,其中   M_C是继承自的元类   M_AM_B

     

然而,Python并不是那么神奇,而且   它不会自动创建M_C。   相反,它引发了一个TypeError,   警告程序员可能的   混乱。

因此,我建议在Python中限制使用Python中的多重继承:

  1. 您必须,因为您的问题域要求您组合两个单独维护的单继承库。
  2. 您已经通过元类型和元类获得了这样的流畅性,您可以像编写打印语句一样轻松自信地编写recipe 204197或其等价物。
  3. 编辑:

    这是An Introduction to Python中的Guido van Rossum:

      很明显,不分青红皂白地使用   多重继承是一种维护   噩梦,因为依赖   关于要避免的约定的Python   意外名称冲突。

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

      

    元类型确定各种政策   对于类型,例如什么   在调用类型时,动态类型是如何发生的(无论是否为   类型的 dict 可以在创建后修改),是什么   方法解析顺序是,如何查看实例属性   等等。

         

    我认为从左到右的深度优先并不是最好的   解决方案,当你想从多个使用最多的时候   继承。

         

    我认为具有多重继承,是元的类型   子类型必须是所有基类型的元类型的后代。

    意味着你不应该使用多重继承;我只是警告你,所以有一天你不会惊讶地发现自己拍打你的额头并大声说道:“哦!” 我的一个子类型的元类型不是其所有基类型的元类型的后代!这种情况发生时你不讨厌吗?“