繁体   English   中英

遍历Python对象树

[英]Traversing a Python object tree

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

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

请在Python Cookbook中查看食谱(或者甚至可以在“印刷版” 食谱中找到其更好的版本,我相信您实际上可以通过Google图书搜索免费阅读,或者可以肯定地使用免费的1在O'Reilly的“ Safari”网站上阅读)个星期的试用订阅-我对哈德森的原始食谱做了很多编辑,以获取“印刷书籍”版本!)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM