一个简单的例子:
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
DeclarativeFieldsMetaclass
in django . 这个想法是让元类处理特定属性的字典合并。这是更多的工作。此外,由于它引入了 python 中通常不会发生的魔法,因此这可能被认为是一个糟糕的选择。我也倾向于不使用元类,除非有必要避免冲突。
一个主要优点是用户不需要手动聚合属性数据。
还有别的办法吗?
我想知道其他人对每种方法在良好编程实践方面的看法。
在我的例子中,我使用的是 MultiModelForm
from django-betterforms ,并且有一个只有几个 ModelForm
的基本表单,但想要扩展它。我认为继承的类不需要从父类的 form_classes
属性中复制 ModelForm
。
是否应该像选项 2 那样由用户管理继承,还是应该像选项 3 那样使用元类自动处理继承?每个选项是否还有我未讨论的其他问题?
最佳答案
您可以使用 dictionary.update()
来做到这一点函数,它将向现有字典添加一个新字典
示例
>>> class A:
... attr = {'a': 1}
...
>>> class B(A):
... attr = dict(A.attr)
... attr.update({'b' : 2 })
...
>>>
>>> A.attr
{'a': 1}
>>> B.attr
{'a': 1, 'b': 2}
它有什么作用?
attr = dict(A.attr)
从A.attr
返回一个新字典。这很重要,因为如果我们写attr = A.attr
我们最终将更新
A
类的attr
而不是B
类。attr.update({'b' : 2 })
通过添加新字典{'b' 更新
.B.attr
: 2
关于python - 继承和聚合类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690660/