I also met this problem. I solved this with a metaclass that can also work with multiple inheritance:
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}
source share