import sys
def attribute(name, type=None, default=None, ro=False):
@property
def fn(self):
return getattr(self, '_' + name, default)
if not ro:
@fn.setter
def fn(self, value):
if type is not None and not isinstance(value, type):
raise TypeError
setattr(self, '_' + name, value)
sys._getframe(1).f_locals[name] = fn
class Doge:
attribute('such_var', int, 10)
attribute('much_data', str)
d = Doge()
print(d.such_var, d.much_data)
d.such_var = 12
d.much_data = 'very test'
print(d.such_var, d.much_data)
d.such_var = 'omg error'
aW1wb3J0IHN5cwoKCmRlZiBhdHRyaWJ1dGUobmFtZSwgdHlwZT1Ob25lLCBkZWZhdWx0PU5vbmUsIHJvPUZhbHNlKToKICAgIEBwcm9wZXJ0eQogICAgZGVmIGZuKHNlbGYpOgogICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsICdfJyArIG5hbWUsIGRlZmF1bHQpCgogICAgaWYgbm90IHJvOgogICAgICAgIEBmbi5zZXR0ZXIKICAgICAgICBkZWYgZm4oc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBpZiB0eXBlIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZSk6CiAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKICAgICAgICAgICAgc2V0YXR0cihzZWxmLCAnXycgKyBuYW1lLCB2YWx1ZSkKCiAgICBzeXMuX2dldGZyYW1lKDEpLmZfbG9jYWxzW25hbWVdID0gZm4KCgpjbGFzcyBEb2dlOgogICAgYXR0cmlidXRlKCdzdWNoX3ZhcicsICBpbnQsIDEwKQogICAgYXR0cmlidXRlKCdtdWNoX2RhdGEnLCBzdHIpCgoKZCA9IERvZ2UoKQpwcmludChkLnN1Y2hfdmFyLCBkLm11Y2hfZGF0YSkKZC5zdWNoX3ZhciAgPSAxMgpkLm11Y2hfZGF0YSA9ICd2ZXJ5IHRlc3QnCnByaW50KGQuc3VjaF92YXIsIGQubXVjaF9kYXRhKQpkLnN1Y2hfdmFyID0gJ29tZyBlcnJvcic=