Я думаю (проверено в аналогичном случае), что реверсирование базовых классов работает:
class myfoo(bar_for_foo_mixin, foo):
def __init__(self):
print "myfoo __init__ called"
self.bar()
поэтому в mro () он найдет конкретную версию bar (), прежде чем найдет абстрактную. Не знаю, если это действительно то, что происходит в фоновом режиме, хотя.
Ура, Ларс
PS: код, который работал в Python 2.7 (Python 3 имеет другой способ установки метаклассов), был:
class A(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def do(self):
pass
class B(object):
def do(self):
print "do"
class C(B, A):
pass
c = C()