The Music Guy wrote: ...
def main(): ... class MyMixin(object):
This is a mistake. If Mixins inherit from CommonBase as well, no order of class definition can catch you out. If it doesn't, you can get yourself in trouble.
def method_x(self, a, b, c): super(MyMixin, self).method_x(a, b, c) print "MyMixin.method_x(%s, %s, %s, %s)" % (repr(self), repr(a), repr(b), repr(c)) class CommonBase(object): def method_x(self, a, b, c): print "CommonBase.method_x(%s, %s, %s, %s)" % (repr(self), repr(a), repr(b), repr(c)) class BaseA(CommonBase): ...
Redoing this example for small prints: def main(): for n, class_ in enumerate( (BaseA, BaseB, BaseC, FooV, FooW, FooX, FooY, FooZ, BarW, BarX, BarY, BarZ)): instance = class_() instance.method_x(n, n * '-', hex(n*13)) print class CommonBase(object): def method_x(self, a, b, c): # really, %r is the way to go. print "CommonBase.method_x(%r, %r, %r, %r)" % (self, a, b, c) def __repr__(self): # Just so we have a more compact repr return '%s.%s' % (self.__class__.__name__, id(self)) class Mixin(CommonBase): def method_x(self, a, b, c): super(Mixin, self).method_x(a, b, c) print "Mixin", class MyMixin(CommonBase): def method_x(self, a, b, c): super(MyMixin, self).method_x(a, b, c) print "MyMixin", class BaseA(CommonBase): def method_x(self, a, b, c): super(BaseA, self).method_x(a, b, c) print "BaseA", class BaseB(CommonBase): def method_x(self, a, b, c): super(BaseB, self).method_x(a, b, c) print "BaseB", class BaseC(CommonBase): pass class FooV(Mixin, BaseA): def method_x(self, a, b, c): super(FooV, self).method_x(a, b, c) print "FooV", class FooW(Mixin, MyMixin, BaseA): def method_x(self, a, b, c): super(FooW, self).method_x(a, b, c) print "FooW", class FooX(MyMixin, BaseA): def method_x(self, a, b, c): super(FooX, self).method_x(a, b, c) print "FooX", class FooY(MyMixin, BaseB): pass class FooZ(MyMixin, BaseC): def method_x(self, a, b, c): super(FooZ, self).method_x(a, b, c) print "FooZ", class BarW(Mixin, BaseA, MyMixin): def method_x(self, a, b, c): super(BarW, self).method_x(a, b, c) print "BarW", class BarX(BaseA, MyMixin): def method_x(self, a, b, c): super(BarX, self).method_x(a, b, c) print "BarX", class BarY(BaseB, MyMixin): def method_x(self, a, b, c): super(BarY, self).method_x(a, b, c) print "BarY", class BarZ(BaseB, Mixin): def method_x(self, a, b, c): super(BarZ, self).method_x(a, b, c) print "BarZ", >>> main() # prints CommonBase.method_x(BaseA.18591280, 0, '', '0x0') BaseA ... CommonBase.method_x(FooZ.18478384, 7, '-------', '0x5b') MyMixin FooZ CommonBase.method_x(BarW.18480592, 8, '--------', '0x68') MyMixin BaseA Mixin BarW ... If you make of Mixin and MyMixin inherit from object you get: CommonBase.method_x(BaseA.18613328, 0, '', '0x0') BaseA ... CommonBase.method_x(FooZ.18480592, 7, '-------', '0x5b') MyMixin FooZ CommonBase.method_x(BarW.18591280, 8, '--------', '0x68') BaseA Mixin BarW ... Note that in the BarW case (with object), not all mixins are called. --Scott David Daniels scott.dani...@acm.org -- http://mail.python.org/mailman/listinfo/python-list