【发布时间】:2015-08-21 19:52:54
【问题描述】:
一个简单的例子:
class A:
attr = {'a': 1}
class B(A):
attr = {'b': 2} #overrides A.attr
我想要的是一种聚合字典的方法。我能想到的只有这些选项:
- 忽略那种令人不安的感觉,手动复制所有内容。
-
手动添加字典:
class B(a): attr = dict(list(six.iteritems(A.attr)) + list(six.iteritems({ 'b': 2 })))注意
'b': 2必须排在第二位,所以它的键会影响A。这必须明确引用
A(有什么方法可以通过super得到这个吗?)。它还需要手动应用这种微继承。 -
这也是元类可以实现的。我看过done in
DeclarativeFieldsMetaclassin django。 这个想法是让元类处理字典合并特定属性。这是更多的工作。此外,由于它引入了在 python 中通常不会发生的魔法,这可能被认为是一个糟糕的选择。我也更喜欢不使用元类,除非有必要避免冲突。
一个主要优点是用户不需要手动聚合属性数据。
还有其他方法吗?
我想知道其他人对每种方法在良好编程实践方面的看法。
在我的例子中,我使用的是MultiModelForm from django-betterforms,并且有一个只有几个ModelForms 的基本形式,但我想扩展它。我认为继承的类不需要从父类复制form_classes 属性中的ModelForms。
是否应该像选项 2 那样由用户来管理继承,或者 MultiModelForm 是否应该像选项 3 那样使用元类自动处理它?我没有讨论过的每个选项是否还有其他问题?
【问题讨论】:
-
In Python 3.5,你可以做到
attr = {**A.attr, 'b': 2}。
标签: python django inheritance metaclass