模块
通常来说,一个.py文件就叫做一个模块,可以直接利用不带.py的方式将一个py文件当做模块引入,之后,引入的模块就以变量的形式存在于当前文件下,可以通过.的方式直接引用其中的方法等。例如:
#main.py
import test
print(test.add(1,2))
#test.py
def add(x,y):
return x+y
引入方法
import test
print(test.add(1,2))
from test import add
print(add(1,2))
from test import *
print(add(1,2))
print(sub(1,2))
上面三种引入方法均可以使用,不同的是,第一个引用下本地变量只有test,其余的变量都需要使用test来间接引用,第二个可以直接使用add,第三个可以直接使用test中的所有变量
引入原理
引入的过程中,会先执行test.py,在执行当前脚本,例如如下程序:
#test.py
def add(x,y):
return x+y
print("test")
#main.py
import test
print(test.add(1,2))
#输出打印
test
3
引入时在sys.path变量中的路径下寻找对应的模块,找不到则会报错,而sys.path变量通常只会将当前的工作文件夹加入其中,不支持递归查找,因此为了避免将所有的模块统统放入主代码所在的文件夹下,引入包的概念
包
包和文件夹不同的地方就在于包下有一个文件叫做 init.py,当引入一个包的时候,会先执行 init.py文件。同时,可以直接通过包的方式引入包中的模块,例如:
#包test1
#包下init.py文件
print("this is test1 packet")
#包下test.py
def add(x,y):
return x+y
#main.py 和test1在同级目录,此时sys.path里面只有main.py的路径,因此只能找到同级的
#包test1,此时可以通过包间接引用test
import test1.test
print(test.add(1,2))
from test1.test import add
print(add(1,2))
#输出
this is test1
3
3
__name__变量
__name__变量是一个系统保留变量,在当前直接执行的脚本下,
变量值为main,在其余被调用脚本下,值为其相对路径加脚本名字,
因为脚本在被别人引用的时候会执行脚本,因此需要将自己在脚本中写的执行代码
用 if __name__ == main封装起来,防止别人在引用自己脚本时执行不想要的代码,例如
#test.py
def add(x,y):
return x+y
if __name__=='__main__':
print(this is test main )
print(__name__)
#main.py
import test
print(test.add(1,2))
print(__name__ + " this is main")
#输出
test.py
3
main this is main