Цель состоит в том, чтобы создать фиктивный класс, который будет вести себя как набор результатов db.
Так, например, если запрос к базе данных возвращает, используя выражение dict, {'ab':100, 'cd':200}
, то я хотел бы видеть:
>>> dummy.ab
100
Сначала я подумал, может быть, я мог бы сделать это так:
ks = ['ab', 'cd']
vs = [12, 34]
class C(dict):
def __init__(self, ks, vs):
for i, k in enumerate(ks):
self[k] = vs[i]
setattr(self, k, property(lambda x: vs[i], self.fn_readyonly))
def fn_readonly(self, v)
raise "It is ready only"
if __name__ == "__main__":
c = C(ks, vs)
print c.ab
но c.ab
возвращает объект свойства.
Замена строки setattr
на k = property(lambda x: vs[i])
совершенно бесполезна.
Итак, как правильно создать свойство экземпляра во время выполнения?
P.S. Мне известна альтернатива, представленная в Как используется метод __getattribute__
?