我有一个组织类似的项目

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, 例如,应该工作得很好,没有"撤消"或"重置"。

但究竟是什么代码 您使用,而不是执行那些"任何变化"。..?

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top