代码之家  ›  专栏  ›  技术社区  ›  Luper Rouch François Lagunas

遍历python对象树

  •  1
  • Luper Rouch François Lagunas  · 技术社区  · 16 年前

    我正在尝试在Python中实现动态重新加载对象,这些对象反映了实时的代码更改。

    模块重新加载正在工作,但为了使更改生效,我必须重新创建模块类的每个实例。

    问题是对象数据(对象 __dict__ 内容)在过程中丢失。

    所以我尝试了另一种方法:

    def refresh(obj, memo=None):
        if memo is None:
            memo = {}
        d = id(obj)
        if d in memo:
            return
        memo[d] = None
        try:
            obj.__class__ = getattr(sys.modules[obj.__class__.__module__], 
                    obj.__class__.__name__)
        except TypeError:
            return
        for item in obj.__dict__.itervalues():
            if isinstance(item, dict):
                for k, v in item.iteritems():
                    refresh(k, memo)
                    refresh(v, memo)
            elif isinstance(item, (list, tuple)):
                for v in item:
                    refresh(v, memo)
            else:
                refresh(item, memo)
    

    令人惊讶的是,它起作用了!在我的对象上调用refresh()之后,新代码就变得有效了,不需要重新创建它们。

    但我不确定这是否是穿过物体的正确方法?有没有更好的方法来遍历对象的组件?

    1 回复  |  直到 16 年前
        1
  •  1
  •   Alex Martelli    16 年前

    this recipe 在python食谱中(或者可能更好的是它的“印刷版”版本,我相信你可以通过谷歌图书搜索免费阅读,或者在O'Reilly的“Safari”网站上使用免费的1周试用订阅——我在Hudson的原始食谱上做了很多编辑以获得“印刷版”的版本!).