题
我有一个组织类似的项目
project/
__init__.py
builder.py
component/
__init__.py
内 builder.py
, ,我有一个名为Builder的类,它有几个类属性,以便实现Borg模式。当我尝试导入Builder时,麻烦就出现了 component/__init__.py
并对类属性进行更改。看起来,当函数返回时,我对包中的类属性所做的任何更改都被撤消。
更新资料:下面是正在发生的事情的一个简单的例子。
builder.py
class Builder(object):
attribute = True
import component
print Builder.attribute
component/___init___.py
from project.builder import Builder
Builder.attribute = False
输出:
False
True
从两行打印的事实来看,我会猜测代码在 builder.py
正在执行两次,这将重置 attribute
"的确如此。
解决方案
你有什么是循环导入:builder导入组件,组件导入builder。
在builder导入组件时,builder尚未完全构建。然后组件导入builder,它执行builder模块的其余部分(全部在 import component
).稍后,当组件被加载时,builder将继续执行之后的所有操作 import component
.
请注意,如果首先加载组件,行为会有所不同!
基本上,你不应该做循环导入。尝试以其他方式组织代码。
其他提示
你应该真正显示(简化版本)你的代码。类似(假设例如那个 project
在系统中。路径):
import builder
builder.Builder.baah = 'boo!'
在 component/__init__.py
, 例如,应该工作得很好,没有"撤消"或"重置"。
但究竟是什么代码 是 您使用,而不是执行那些"任何变化"。..?
不隶属于 StackOverflow