目标是创建一个类似于db结果集的模拟类.
因此,例如,如果数据库查询使用dict表达式返回{'ab':100, 'cd':200},那么我想看到:
>>> dummy.ab
100
Run Code Online (Sandbox Code Playgroud)
起初我想也许我可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
但是c.ab返回一个属性对象.
更换setattr线路k = property(lambda x: vs[i])完全没用.
那么在运行时创建实例属性的正确方法是什么?
我知道我可以通过执行以下操作动态地向对象添加实例方法:
import types
def my_method(self):
# logic of method
# ...
# instance is some instance of some class
instance.my_method = types.MethodType(my_method, instance)
Run Code Online (Sandbox Code Playgroud)
后来我可以打电话instance.my_method(),自我将被正确绑定,一切正常.
现在,我的问题:如何做同样的事情来获得用@property装饰新方法的行为?
我猜是这样的:
instance.my_method = types.MethodType(my_method, instance)
instance.my_method = property(instance.my_method)
Run Code Online (Sandbox Code Playgroud)
但是,这样做会instance.my_method返回一个属性对象.