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
class Proxy(Base):
def __init__(self, item, mixin):
self.__item = item
self.__mixin = mixin
def __getattr__(self, name):
try:
return getattr(self.__item, name)
except AttributeError:
return getattr(self.__mixin, name).__get__(name)
for Item in (A, B):
item = Item()
item = Proxy(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
assert item.__Proxy_item is item
assert item.__Proxy_mixin is Mixin
Y2xhc3MgQmFzZToKICAgIGRlZiBvcGVuKHNlbGYpOiBwYXNzCiAgICBkZWYgcmVhZChzZWxmKTogcGFzcwoKY2xhc3MgQShCYXNlKToKICAgIGRlZiByZWFkKHNlbGYpOiBwYXNzCgpjbGFzcyBCKEJhc2UpOgogICAgZGVmIHJlYWQoc2VsZik6IHBhc3MKCmNsYXNzIE1peGluOgogICAgZGVmIGZlYXR1cmUoc2VsZik6IHBhc3MKCmNsYXNzIFByb3h5KEJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW0sIG1peGluKToKICAgICAgICBzZWxmLl9faXRlbSA9IGl0ZW0KICAgICAgICBzZWxmLl9fbWl4aW4gPSBtaXhpbgoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX19pdGVtLCBuYW1lKQogICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX21peGluLCBuYW1lKS5fX2dldF9fKG5hbWUpCgpmb3IgSXRlbSBpbiAoQSwgQik6CiAgICBpdGVtID0gSXRlbSgpCiAgICBpdGVtID0gUHJveHkoaXRlbSwgTWl4aW4pCiAgICBhc3NlcnQgaXNpbnN0YW5jZShpdGVtLCBCYXNlKQogICAgYXNzZXJ0IGl0ZW0ub3Blbi5fX2Z1bmNfXyBpcyBCYXNlLm9wZW4KICAgIGFzc2VydCBpdGVtLnJlYWQuX19mdW5jX18gaXMgSXRlbS5yZWFkCiAgICBhc3NlcnQgaXRlbS5mZWF0dXJlLl9fZnVuY19fIGlzIE1peGluLmZlYXR1cmUKICAgIGFzc2VydCBpdGVtLl9fUHJveHlfaXRlbSBpcyBpdGVtCiAgICBhc3NlcnQgaXRlbS5fX1Byb3h5X21peGluIGlzIE1peGlu