Python更新继承的类级字典



我正在寻找一种干净、简单的方法来更新从基类继承的类级字典。例如:

class Foo(object):
    adict = {'a' : 1}
class Bar(Foo):
    adict.update({'b' : 2})  # this errors out since it can't find adict

:

Foo.adict == {'a' : 1}
Bar.adict == {'a' : 1, 'b' : 2}

我不喜欢在这里使用实例,如果可能的话也不使用类方法。

请注意,即使这样做有效,您也会更新相同的字典,而不是创建一个新字典(因此Foo.adict is Bar.adictFoo.adict == Bar.adict)。

在任何情况下,最简单的方法是显式引用父类的字典(并复制它,见上文):

class Bar(Foo):
    adict = dict(Foo.adict)
    adict.update({'b': 2})

我也遇到过这个问题。我通过使用元类解决了这个问题,它也可以用于多重继承:

import six

class CheckerMeta(type):
    def __new__(cls, name, bases, attrs):
        new_class = super(CheckerMeta, cls).__new__(cls, name, bases, attrs)
        base_configs = [bc.config for bc in bases if hasattr(bc, 'config')]
        configs = base_configs + [new_class.config]
        new_class.config = {}
        for config in configs:
            new_class.config.update(config)
        return new_class

class BaseChecker(six.with_metaclass(CheckerMeta)):
    config = {}

class CheckerA(BaseChecker):
    config = {'a': 1}

class CheckerB(BaseChecker):
    config = {'b': 2}

class CheckerC(CheckerA, CheckerB):
    config = {'c': 3}

assert CheckerA.config == {'a': 1}
assert CheckerB.config == {'b': 2}
assert CheckerC.config == {'a': 1, 'b': 2, 'c':3}

"我不喜欢在这里使用实例,如果可能的话也不使用类方法。"

。所以不要。

foo_adict =  {'a' : 1}
def B():
   foo_adict.update({'b': 2})

我不确定你为什么使用类属性级字典,它很少以有用或预期的方式表现。

Foo类中初始化adict,在Bar中先调用superinit再调用update进行初始化。

class Foo(object):
    def __init__(self):
        self.adict = {'a': 1}

class Bar(Foo):
    def __init__(self):
        super(Bar, self).__init__()
        self.adict.update({'b': 2})

的例子:

In [14]: b = Bar()
In [15]: b.adict
Out[15]: {'a': 1, 'b': 2}

相关内容

  • 没有找到相关文章

最新更新