from inspect import ismethod
class A:
@property
def prop(self) -> int:
return 1
def method(self) -> int:
return self.prop * 2
class B:
def __init__(self, a: A):
self._a = a
@property
def prop(self) -> int:
return 2
def __getattr__(self, attr):
value = getattr(self._a, attr)
if ismethod(value):
value = value.__func__.__get__(self)
return value
b = B(A())
print(b.prop)
print(b.method())
ZnJvbSBpbnNwZWN0IGltcG9ydCBpc21ldGhvZAoKY2xhc3MgQToKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3Aoc2VsZikgLT4gaW50OgogICAgICAgIHJldHVybiAxCgogICAgZGVmIG1ldGhvZChzZWxmKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvcCAqIDIKCmNsYXNzIEI6CiAgICBkZWYgX19pbml0X18oc2VsZiwgYTogQSk6CiAgICAgICAgc2VsZi5fYSA9IGEKCiAgICBAcHJvcGVydHkKICAgIGRlZiBwcm9wKHNlbGYpIC0+IGludDoKICAgICAgICByZXR1cm4gMgoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZi5fYSwgYXR0cikKICAgICAgICBpZiBpc21ldGhvZCh2YWx1ZSk6CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuX19mdW5jX18uX19nZXRfXyhzZWxmKQogICAgICAgIHJldHVybiB2YWx1ZQoKYiA9IEIoQSgpKQpwcmludChiLnByb3ApCnByaW50KGIubWV0aG9kKCkp