Skip to content

Instantly share code, notes, and snippets.

@manumilou
Created October 4, 2018 18:53
Show Gist options
  • Save manumilou/19c59b18e7bca2b45ca4811bfebb04ac to your computer and use it in GitHub Desktop.
Save manumilou/19c59b18e7bca2b45ca4811bfebb04ac to your computer and use it in GitHub Desktop.
Example on how to merge class attribute through class hierarchy
class DefaultsMetaBase(type):
"""Automatically merges headers from all parent classes."""
def __call__(self, *args, **kwargs):
obj = type.__call__(self)
print("Metaclass %s called" % obj.__class__)
for klass in obj.__class__.__mro__:
if klass == obj.__class__ or klass == Base or not issubclass(klass, Base):
print("discarding %s" % klass)
continue
print("keeping %s" % klass)
if hasattr(klass, 'headers'):
d = klass.headers.copy()
d.update(obj.headers)
obj.headers = d
return obj
class Base(object):
__metaclass__= DefaultsMetaBase
class A(Base):
headers = {'a': 'default a', 'd': 'test d'}
class B(A):
headers = {'b': 'default b'}
class C(A):
headers = {'a': 'a overridden in C'}
class D(C):
headers = {'d': 'd overridden in D'}
def test():
a = A()
b = B()
c = C()
d = D()
print a.headers
print b.headers
print c.headers
print d.headers
assert (a.headers == {'a': 'default a', 'd': 'test d'})
assert (b.headers == {'a': 'default a', 'b': 'default b', 'd': 'test d'})
assert (c.headers == {'a': 'a overridden in C', 'd': 'test d'})
assert (d.headers == {'a': 'a overridden in C', 'd': 'd overridden in D'})
print("pass")
test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment