将属性注入python模块不能按预期工作

时间:2015-04-09 15:25:26

标签: python

我正在尝试用python做恶魔,但它并没有像预期的那样工作:

def inject_imports(self,module):
    m = sys.modules[module]
    for key in self._classdict.keys():
        setattr(m, key, property(lambda : getattr(self, key)))
    for key in self._methoddict.keys():
        setattr(m, key, property(lambda : getattr(self,key)))

我用lambda以这种错综复杂的方式注入它的原因是我正在模仿一个懒惰的导入。问题是在运行时,我收到消息:

AttributeError: 'property' object has no attribute 'attribute'

实际上,属性对象实际上并不提供对属性的直接访问,而是具有fget / fset /等等。我怎样才能解决这个问题?我基本上只需要一个代理,透明地将对自身的访问重定向到lambda的结果,或类似的东西。

1 个答案:

答案 0 :(得分:0)

module这是内置module类型的实例。 property类型依赖于protocol descriptor,协议描述符仅在类属性上调用(您可以将property(或任何其他描述符)设置为实例属性,但随后它会&#39 ; s __get__ / __set__ / __del__方法无法被调用。

如果你想要一个使用描述符的代理,你必须将模块包装在一个代理类中,而不是在类上设置你的属性......但是我不确定它是否会起作用如预期的那样。