class CallbaseError(AttributeError):
pass
def callbase(obj, base, methodname='__init__', args=(), raiseIfMissing=None):
try: method = getattr(base, methodname)
except AttributeError:
if raiseIfMissing:
raise CallbaseError, methodname
return None
if args is None: args = ()
return method(obj, *args)
# an example: ensure __init__ is called w/o args on _all_ bases
# (if present; ignore no-such-method issues)
class A(B, C, D, E):
def __init__(self):
for base in A.__bases__:
callbase(self, base)
# class-A-specific initialization here
self.cachePlokki = {}
# another typical use case: override a method in some base,
# also providing some other stuff around it; e.g. for cache
# on-demand purposes
def getPlokki(self, *args):
try: return self.cachePlokki[args]
except IndexError: pass
for base in self.__class__.__bases__:
try: result=callbase(self, base, 'getPlokki', args, 1)
except CallbaseError: pass
else: break
# ok to raise here if result still not bound
self.cachePlokki[args] = result
return result