I'm creating a class that takes a variable length set of keys and creates attributes for each of them:
class C:
def __init__(self, keys_values: Dict[str, int]):
for k, v in keys_values.item():
setattr(self, k, v)
I want to take this a step further and set custom setters and getters for each of these attributes. I tried:
class C:
def __init__(self, keys_values):
for k, v in keys_values.items():
setattr(self, f'_{k}', v)
setattr(self, k, property(
lambda: self._getter(k),
lambda v: self._setter(k, v)
))
def _getter(self, k):
return getattr(self, f'_{k}')
def _setter(self, k, v):
# Do some custom stuff
setattr(self, f'_{k}', v)
c = C({'a': 1, 'b': 2})
print(c._a)
print(c.a)
but the c.a prints out as a property object <property object at 0x7fe9dc1009a0>. Is there an extra step I need to do to have it register is a property of c? And overall is there a better pattern for this?