class Base:
def open(self): pass
def read(self): pass
class A(Base):
def read(self): pass
class B(Base):
def read(self): pass
class Mixin:
def feature(self): pass
def add_mixin(item, mixin):
class _Proxy(Base):
def __getattribute__(self, name):
try:
return getattr(item, name)
except AttributeError:
return getattr(mixin, name).__get__(item)
return _Proxy()
for Item in (A, B):
item = Item()
item = add_mixin(item, Mixin)
assert isinstance(item, Base)
assert item.open.__func__ is Base.open
assert item.read.__func__ is Item.read
assert item.feature.__func__ is Mixin.feature
Y2xhc3MgQmFzZToKICAgIGRlZiBvcGVuKHNlbGYpOiBwYXNzCiAgICBkZWYgcmVhZChzZWxmKTogcGFzcwoKY2xhc3MgQShCYXNlKToKICAgIGRlZiByZWFkKHNlbGYpOiBwYXNzCgpjbGFzcyBCKEJhc2UpOgogICAgZGVmIHJlYWQoc2VsZik6IHBhc3MKCmNsYXNzIE1peGluOgogICAgZGVmIGZlYXR1cmUoc2VsZik6IHBhc3MKCmRlZiBhZGRfbWl4aW4oaXRlbSwgbWl4aW4pOgogICAgY2xhc3MgX1Byb3h5KEJhc2UpOgogICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihpdGVtLCBuYW1lKQogICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihtaXhpbiwgbmFtZSkuX19nZXRfXyhpdGVtKQogICAgcmV0dXJuIF9Qcm94eSgpCgpmb3IgSXRlbSBpbiAoQSwgQik6CiAgICBpdGVtID0gSXRlbSgpCiAgICBpdGVtID0gYWRkX21peGluKGl0ZW0sIE1peGluKQogICAgYXNzZXJ0IGlzaW5zdGFuY2UoaXRlbSwgQmFzZSkKICAgIGFzc2VydCBpdGVtLm9wZW4uX19mdW5jX18gaXMgQmFzZS5vcGVuCiAgICBhc3NlcnQgaXRlbS5yZWFkLl9fZnVuY19fIGlzIEl0ZW0ucmVhZAogICAgYXNzZXJ0IGl0ZW0uZmVhdHVyZS5fX2Z1bmNfXyBpcyBNaXhpbi5mZWF0dXJl