从另一个文件修改实例变量?

时间:2012-03-01 04:17:35

标签: oop python

可以从另一个文件修改实例变量吗?

我想要的是从File_2修改File_1中的实例变量。

例如:

//File 1
import File_2

class Main:
    def __init__(self):
        self.example = "Unmodified"

    def modify(self):
        File_2.modify()

main = Main()
main.modify()


//File 2
import File_1

def modify():
    File_1.main.example = "Modified"

这给了我以下输出:

Traceback (most recent call last):
File "File_1.py", line 4, in <module>
  import File_2
File "File_2.py", line 3, in <module>
  import File_1
File "File_1.py", line 14, in <module>
  main.modify()
File "File_1.py", line 11, in modify
  File_2.modify()
AttributeError: 'module' object has no attribute 'modify'

为什么?

编辑(更好地解释):
主类的实例(在文件1中)有一个变量;我想要的是从另一个文件(文件2)修改该变量。我修改了一点代码:

//File 1
import File_2

class Main:
    def __init__(self):
        self.example = "Unmodified"

    def modify(self):
        File_2.modify()

if __name__ == "__main__":
    main = Main()
    main.modify()


//File 2
def modify():
    //do some stuff
    //now I want to modify the example variable from the main class, but how?

2 个答案:

答案 0 :(得分:1)

您的代码中充满了循环导入,请查看Python: Circular (or cyclic) imports以了解我在说什么。

基本上问题是当编译器出现在这一行时:

File_2.modify()

File_2 未完全加载,意味着编译器还没有读取这些行:

def modify():
    File_1.main.example = "Modified"

因为它从前一个回到 File_1

import File_1

除此之外,你的代码似乎很奇怪。如果您想提供有关实际代码的更多信息,可能更好的设计可以解决您的问题。

编辑: 删除循环导入。做你似乎需要的一种方法是将一个参数传递给File_2.modify(arg)函数,然后处理它:

# File_2
# !! do NOT import File_1 in this file
def modify(obj):
    obj.value += 7

但在你的情况下,你必须将整个对象(self)传递给modify函数,并且仅修改一个值是一种浪费。

最好做一些事情:

# File_1
import File_2
class Main:
    # ...
    def modify()
        self.value = File_2.modify(self.value)

# File_2
# !! do NOT import File_1 in this file
def modify(num):
    return num + 7

但这又是一个例子,因为你没有展示你的真实代码,我们无法真正告诉你在你的情况下最好的东西(可能都不是上面的代码)或者非常帮助你。

答案 1 :(得分:0)

在Python中不起作用的是你想要做的“交叉导入” - 当您同时导入两个文件时,您会出现不一致和不良副作用。在这种情况下,当在File_1解析时运行main.modify()行时,它确实在内存中找到了尚未完全初始化的“File_2”模块 - 其中“修改”功能尚不存在。

重新排序yoru代码,因此您没有循环导入,它应该工作 - 例如,如果您首先导入的teh文件 - 或作为主模块运行,File_1中的File_1,而不是在第一行中导入File_2,则将其导入修改功能内部,如下所示:

#File 2


def modify():
    import File_1
    File_1.main.example = "Modified"

N.B。这些导入,因为它们引用了一个已经在解释器上导入的模块,只需将已加载的模块对象绑定到运行范围中的变量 - 换句话说,Python不会对模块执行磁盘访问每次调用函数时都会生成文件。

相关问题