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 __getattribute__(self, name):
try:
return getattr(item := object.__getattribute__(self, '__dict__')['item'], name)
except AttributeError:
return getattr(object.__getattribute__(self, '__dict__')['mixin'], name).__get__(item)
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
Y2xhc3MgQmFzZToKICAgIGRlZiBvcGVuKHNlbGYpOiBwYXNzCiAgICBkZWYgcmVhZChzZWxmKTogcGFzcwoKY2xhc3MgQShCYXNlKToKICAgIGRlZiByZWFkKHNlbGYpOiBwYXNzCgpjbGFzcyBCKEJhc2UpOgogICAgZGVmIHJlYWQoc2VsZik6IHBhc3MKCmNsYXNzIE1peGluOgogICAgZGVmIGZlYXR1cmUoc2VsZik6IHBhc3MKCmNsYXNzIFByb3h5KEJhc2UpOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW0sIG1peGluKToKICAgICAgICBzZWxmLml0ZW0gPSBpdGVtCiAgICAgICAgc2VsZi5taXhpbiA9IG1peGluCgogICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihpdGVtIDo9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfX2RpY3RfXycpWydpdGVtJ10sIG5hbWUpCiAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgogICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX19kaWN0X18nKVsnbWl4aW4nXSwgbmFtZSkuX19nZXRfXyhpdGVtKQoKZm9yIEl0ZW0gaW4gKEEsIEIpOgogICAgaXRlbSA9IEl0ZW0oKQogICAgaXRlbSA9IFByb3h5KGl0ZW0sIE1peGluKQogICAgYXNzZXJ0IGlzaW5zdGFuY2UoaXRlbSwgQmFzZSkKICAgIGFzc2VydCBpdGVtLm9wZW4uX19mdW5jX18gaXMgQmFzZS5vcGVuCiAgICBhc3NlcnQgaXRlbS5yZWFkLl9fZnVuY19fIGlzIEl0ZW0ucmVhZAogICAgYXNzZXJ0IGl0ZW0uZmVhdHVyZS5fX2Z1bmNfXyBpcyBNaXhpbi5mZWF0dXJl