class myProp:
__props={}
def __getattribute__(self, name):
if name in object.__getattribute__(self, "_myProp__props").keys():
return self.__props[name](self)
return object.__getattribute__(self, name)
def __delattribute__(self, name):
if name in self.__props.keys():
del self.__props[name]
return
object.__delattribute__(self, name)
def __setattr__(self, name, value):
if name in self.__props.keys():
return self.__props[name](self, value)
return object.__setattr__(self, name, value)
@classmethod
def wrapper(self, fn):
self.__props[fn.__name__]=fn
class test(myProp):
def __init__(self):
self.x=5
@myProp.wrapper
def myfunc(self, value=None):
if value:
self.x=value*2
return self.x-2
x= test()
print(x.myfunc)
x.myfunc=6
print(x.myfunc)
Y2xhc3MgbXlQcm9wOgogICAgX19wcm9wcz17fQogICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CiAgICAgICAgaWYgbmFtZSBpbiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAiX215UHJvcF9fcHJvcHMiKS5rZXlzKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcHJvcHNbbmFtZV0oc2VsZikKICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKICAgIGRlZiBfX2RlbGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgogICAgICAgIGlmIG5hbWUgaW4gc2VsZi5fX3Byb3BzLmtleXMoKToKICAgICAgICAgICAgZGVsIHNlbGYuX19wcm9wc1tuYW1lXQogICAgICAgICAgICByZXR1cm4KICAgICAgICBvYmplY3QuX19kZWxhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQogICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKICAgICAgICBpZiBuYW1lIGluIHNlbGYuX19wcm9wcy5rZXlzKCk6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcHJvcHNbbmFtZV0oc2VsZiwgdmFsdWUpCiAgICAgICAgcmV0dXJuIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHdyYXBwZXIoc2VsZiwgZm4pOgogICAgICAgIHNlbGYuX19wcm9wc1tmbi5fX25hbWVfX109Zm4KCmNsYXNzIHRlc3QobXlQcm9wKToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLng9NQogICAgICAgIAogICAgQG15UHJvcC53cmFwcGVyCiAgICBkZWYgbXlmdW5jKHNlbGYsIHZhbHVlPU5vbmUpOgogICAgICAgIGlmIHZhbHVlOgogICAgICAgICAgICBzZWxmLng9dmFsdWUqMgogICAgICAgIHJldHVybiBzZWxmLngtMgoKeD0gdGVzdCgpCnByaW50KHgubXlmdW5jKQp4Lm15ZnVuYz02CnByaW50KHgubXlmdW5jKQo=