可以从另一个文件修改实例变量吗?
我想要的是从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?
答案 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不会对模块执行磁盘访问每次调用函数时都会生成文件。