从包导入时,类属性重置

时间:2010-07-09 22:20:48

标签: python packages

我有一个类似

的项目
project/
    __init__.py
    builder.py
    component/
        __init__.py

builder.py中,我有一个名为Builder的类,它具有多个类属性以实现Borg模式。当我尝试在component/__init__.py中导入Builder并更改类属性时出现问题。看来,当函数返回时,我对包中的类属性所做的任何更改都将被撤消。

更新:以下是正在发生的事情的简单示例。

builder.py

class Builder(object):
    attribute = True

import component

print Builder.attribute

组件/ ___初始化___。PY

from project.builder import Builder

Builder.attribute = False

输出:

False
True

根据打印两行的事实判断,我猜测builder.py中的代码正在执行两次,这会将attribute的值重置为True。

2 个答案:

答案 0 :(得分:1)

您拥有的是循环导入:构建器导入组件,组件导入构建器。

在构建器导入组件时,构建器尚未完全构建。然后是组件导入构建器,它执行构建器模块的其余部分(全部在import component之后)。稍后,当加载组件时,构建器将再次继续import component之后的所有内容。

请注意,如果首先加载组件,行为会有所不同!

基本上,你不应该进行循环进口。尝试以其他方式组织代码。

答案 1 :(得分:0)

您应该真正展示您的代码(简化版)。类似的东西(假设例如project在sys.path中):

import builder
builder.Builder.baah = 'boo!'
例如,component/__init__.py中的

应该可以正常工作,没有“撤消”或“重置”。

但是,您正在使用 的代码来执行那些“无论发生什么变化”......?