It seems to me that you want something like what usually happens with class attributes - children inherit parent attributes and can optionally hide parent attributes with their values.
eg.
class A(object): a = 'a' class B(A): b = 'b' class C(A): a = 'c' assert Aa == 'a'and A().a == 'a' assert Ba == 'a'
It also allows instances to override default values.
a = A() aa = 'not a' assert Aa == 'a' and A().a == 'a' assert aa == 'not a'
However, you may not want your default values to be available this way. Do not worry. Define a default class for the parent and ask them to define child defaults. eg.
class A(object): class defaults(object): a = 'a' class B(A): class defaults(A.defaults): b = 'b' class C(A): class defaults(A.defaults): a = 'c' assert A.defaults.a == 'a' and A().defaults.a == 'a' assert B.defaults.a == 'a'
Or, really, you really want the default values to be a dictate-like object, and then just define an object of type dict that overrides __getitem__ and various other methods you can take care of.
def defaults(**kwargs): """decorator to add defaults to a class""" def default_setter(cls): if not hasattr(cls, "defaults"): cls.defaults = DefaultGetter() for key, value in kwargs: setattr(cls, "_default_"+key, value) return cls return default_setter class DefaultGetter(object): """dict-like object that retrieves the defaults""" def __getitem__(self, name): try: return getattr(self.owner, "_default_" + name) except AttributeError: raise KeyError(name) from None @defaults(a='a') class A(object): pass assert A.defaults['a'] == 'a' assert A._default_a == 'a'
Dunes source share