代码之家  ›  专栏  ›  技术社区  ›  exupero

从包导入时类属性重置

  •  1
  • exupero  · 技术社区  · 16 年前

    我有一个项目是这样组织的

    project/
        __init__.py
        builder.py
        component/
            __init__.py
    

    builder.py ,我有一个名为Builder的类,它有几个类属性来实现Borg模式。当我试图在中导入生成器时,问题就出现了 component/__init__.py 并对类属性进行更改。似乎当函数返回时,我对包中的类属性所做的任何更改都将撤消。

    生成器.py

    class Builder(object):
        attribute = True
    
    import component
    
    print Builder.attribute
    

    from project.builder import Builder
    
    Builder.attribute = False
    

    输出:

    False
    True
    

    从打印两行的事实来看,我猜代码 正在执行两次,这将重置 attribute

    2 回复  |  直到 16 年前
        1
  •  1
  •   zvone    16 年前

    在生成器导入组件时,生成器尚未完全构造。然后组件导入builder,它执行builder模块的其余部分(全部在 import component 导入组件 .

    请注意,如果先加载组件,行为将不同!

    基本上,你不应该做循环导入。试着用其他方式组织代码。

        2
  •  0
  •   Alex Martelli    16 年前

    project 在系统路径中):

    import builder
    builder.Builder.baah = 'boo!'
    

    在里面 component/__init__.py

    但到底是什么代码