My main.py包含:
import functions
a=2
b=3
print(functions.function1(2))
我的函数.py包含:
import main
def function1(x):
return x+main.a+main.b
def function2(x):
return x-main.a-main.b
def function3(x):
return x*main.a*main.b
当我运行main(它和functions.py在同一个文件夹中(时,它会返回一个错误:
File "C:...main.py", line 6, in <module>
print(functions.function1(2))
AttributeError: module 'functions' has no attribute 'function1'
我在这里做错了什么?我以为这是进口东西的方式?我想解决这个问题,但也要准确地理解这个问题。
注意:我不想把a和b作为其他函数的参数传递,原因是,请在单独的文件中查看我的相关问题Python函数:它们都需要相同的参数。如何在多个文件中生成全局变量?
如果您不想将变量a
和b
作为参数,您可以创建一个文件my_vars.py
,并将您的变量:
a = 2
b = 3
然后在您的functions.py中,您可以通过导入my_vars.py:来使用这些变量
import my_vars
def function1(x):
return x + my_vars.a + my_vars.b
def function2(x):
return x - my_vars.a - my_vars.b
def function3(x):
return x * my_vars.a * my_vars.b
那么你的main.py将看起来像:
import functions
print(functions.function1(2))
只使用带有常量的文件通常是一种很好的方法
要了解为什么你的方法不起作用,你可以阅读关于循环进口
不能在文件之间相互导入数据。尝试更改函数.py中的函数以接受a和b作为参数,如:
def function1(x, a, b):
return x+a+b
def function2(x, a, b):
return x-a-b
def function3(x, a, b):
return x*a*b
然后将它们传递到main.py中的函数调用中,如下所示:
import functions
a=2
b=3
print(functions.function1(2, a, b))
原因尚不清楚,但如果您将变量放置在自己的模块中,可能会有所帮助
像这样:
main.py
# main.py
import functions
import variables
# you able to use it here
# print(variables.a)
print(functions.function1(2))
函数.py
# functions.py
import variables
def function1(x):
return x+variables.a+variables.b
def function2(x):
return x-variables.a-variables.b
def function3(x):
return x*variables.a*variables.b
变量.py
# variables.py
a=2
b=3
如果你真的想要不作为参数传递的参数,你可以创建一个类:
#main.py
import functions
f = functions.f()
f.a=2
f.b=3
print(f.function1(2))
# functions.py
class f:
def __init__(self):
# default values for a and b
self.a = 2
self.b = 3
def function1(self, x):
return x + self.a + self.b
使用类还有一个副作用,即可以同时拥有两个实例,每个实例都有自己的a
和b
:
f1 = functions.f()
f1.a = 2
f1.b = 3
f2 = functions.f()
f2.a = 12
f2.b = 13
print(f1.function1(2))
print(f2.function1(2))
在functions.py中,您可以在函数体中import main
,从而避免循环导入。
def function1(x):
import main
return x+main.a+main.b
def function2(x):
import main
return x-main.a-main.b
def function3(x):
import main
return x*main.a*main.b