python - 继承和聚合类属性

标签 python django inheritance metaclass

一个简单的例子:

class A:
    attr = {'a': 1}

class B(A):
    attr = {'b': 2} #overrides A.attr

我想要的是一种聚合字典的方法。我只能想到这些选项:

  1. 忽略那种令人不安的感觉,手工复制所有内容。
  2. 手动添加字典:

    class B(a):
        attr = dict(list(six.iteritems(A.attr)) + list(six.iteritems({
            'b': 2
        })))
    

    注意 'b': 2 必须排在第二位,这样它的键会遮挡 A

    这必须显式引用 A(有什么方法可以通过 super 实现吗?)。它还需要手动应用这种微继承。

  3. 这也是元类可以实现的。我看过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/

相关文章:

使两条对角线都通过矩阵条目 (i,j) 的 Pythonic 方法

python - 从列表中创建一个句子

python - 列之间的交叉点数量

python - django教程manage.py sql polls不产生输出

java - 是否可以更改java中继承类的 protected 变量?

java - C++ 与 Java 构造函数

python - 如何更改 Squish 中 waitForObject 函数使用的默认超时

Django序列化器属性错误: 'unicode' object has no attribute 'isoformat'

python - django orm vs sqlalchemy,它们基本上是同一回事吗?

java - 跨连接子类问题进行限制条件查询