from inspect import ismethod
class A:
@property
def prop(self) -> int:
return 1
@property
def other_prop(self) -> int:
return self.prop * 4 # Uses self.prop
def method(self) -> int:
return self.prop * 2 # Uses self.prop
class B:
def __init__(self, a: A):
self._a = a
@property
def prop(self) -> int:
return 2 # Override A's property
def __getattr__(self, attr):
value = getattr(type(self._a), attr, None)
if isinstance(value, property):
return value.fget(self)
value = getattr(self._a, attr)
if ismethod(value):
value = value.__func__.__get__(self)
return value
b = B(A())
print(b.prop)
print(b.method())
print(b.other_prop)
ZnJvbSBpbnNwZWN0IGltcG9ydCBpc21ldGhvZAoKY2xhc3MgQToKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3Aoc2VsZikgLT4gaW50OgogICAgICAgIHJldHVybiAxCgogICAgQHByb3BlcnR5CiAgICBkZWYgb3RoZXJfcHJvcChzZWxmKSAtPiBpbnQ6CiAgICAgICAgcmV0dXJuIHNlbGYucHJvcCAqIDQgICMgVXNlcyBzZWxmLnByb3AKCiAgICBkZWYgbWV0aG9kKHNlbGYpIC0+IGludDoKICAgICAgICByZXR1cm4gc2VsZi5wcm9wICogMiAgIyBVc2VzIHNlbGYucHJvcAoKY2xhc3MgQjoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhOiBBKToKICAgICAgICBzZWxmLl9hID0gYQoKICAgIEBwcm9wZXJ0eQogICAgZGVmIHByb3Aoc2VsZikgLT4gaW50OgogICAgICAgIHJldHVybiAyICAjIE92ZXJyaWRlIEEncyBwcm9wZXJ0eQoKICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKICAgICAgICB2YWx1ZSA9IGdldGF0dHIodHlwZShzZWxmLl9hKSwgYXR0ciwgTm9uZSkKICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBwcm9wZXJ0eSk6CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5mZ2V0KHNlbGYpCiAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYuX2EsIGF0dHIpCiAgICAgICAgaWYgaXNtZXRob2QodmFsdWUpOgogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLl9fZnVuY19fLl9fZ2V0X18oc2VsZikKICAgICAgICByZXR1cm4gdmFsdWUKCmIgPSBCKEEoKSkKcHJpbnQoYi5wcm9wKQpwcmludChiLm1ldGhvZCgpKQpwcmludChiLm90aGVyX3Byb3Ap