1

我正在尝试在 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() 后,新代码生效,无需重新创建它们。

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

4

1 回答 1

1

在 Python Cookbook 中查看这个食谱(或者在“印刷版”中查看它的更好版本,我相信您实际上可以通过 google 图书搜索免费阅读,或者肯定在 O'Reilly 的“Safari”网站上使用免费的 1 - 周试用订阅——我对 Hudson 的原始配方进行了大量编辑以获得“印刷书”版本!)。

于 2009-07-17T02:24:12.533 回答