我有一个类似
的项目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。
答案 0 :(得分:1)
您拥有的是循环导入:构建器导入组件,组件导入构建器。
在构建器导入组件时,构建器尚未完全构建。然后是组件导入构建器,它执行构建器模块的其余部分(全部在import component
之后)。稍后,当加载组件时,构建器将再次继续import component
之后的所有内容。
请注意,如果首先加载组件,行为会有所不同!
基本上,你不应该进行循环进口。尝试以其他方式组织代码。
答案 1 :(得分:0)
您应该真正展示您的代码(简化版)。类似的东西(假设例如project
在sys.path中):
import builder
builder.Builder.baah = 'boo!'
例如,component/__init__.py
中的应该可以正常工作,没有“撤消”或“重置”。
但是,您正在使用 的代码来执行那些“无论发生什么变化”......?