遍历Python对象树

1 投票
1 回答
2794 浏览
提问于 2025-04-15 12:57

我正在尝试在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 个回答

1

可以看看这个食谱,它在《Python Cookbook》这本书里(或者说,可能在印刷版里更好,我相信你可以通过谷歌图书搜索免费阅读,或者在O'Reilly的“Safari”网站上用免费的1周试用订阅查看——我对Hudson的原始食谱进行了很多编辑,才得到了“印刷书”的版本!)。

撰写回答