导入模块:
import demo money=200 demo.func() # demo.py中有变量名money 在该文件中又定义了一个money=200 那么demo.py中的money 变量打印100 因为会现在本地找,read()函数的本地就是它所在的py文件
运行结果:
同一个模块不会被重复导入
import demo import demo
运行并不会报错,是因为在导入模块时 首先会去sys.modules中去找,这个模块存不存在,存在的话就不导入,不存在就按照sys.path的路径去找,找到就会为这个模块开辟一个命名空间,用来存放这个被导入的模块中的变量,找不到就报错~
import sys import demo import demo print(sys.modules) # 导入模块时首先看sys.modules里有没有,没有的话 就按照sys.path给的路径查找,有就不在重复导入 print(sys.path) # 模块会按照sys.path给的路径去查找
运行结果:
__all__=['变量名','变量名'] 与 from modules import * 配套使用
只有在__all__列表中的变量名和函数名才可以被其他模块引用:
正常情况下:
demo.py: (被导入的模块名不能是数字开头)
money=100 def func(): print('hello,xuanxuan') def func2(): print("你好,璇璇")
02.py文件中:(最好不要这样命名py文件)
import demo print(demo.money) # 导入demo模块之后,可以使用模块.变量名去引用该变量 demo.func() # 可以使用demo.func调用该模块的函数 demo.func2()
运行结果:
在被引用的模块中加上__all__=['变量名1','变量名2'] 只有在这个列表中的变量和函数才可以被其他模块引用(注:__all__后面是一个列表,列表中的元素必须是字符串)
先来看一下被导入的模块demo.py文件:
__all__=['money','func'] # __all__必须和from demo import * 配套! __all__后面必须是一个列表。列表中的元素必须是字符串,里面的元素 才可以被外部导入该demo模块时被引用 money=100 def func(): print('hello,xuanxuan') def func2(): print('你好,璇璇')
先导入demo 模块(要想02.py文件在使用demo.py文件中的变量受到约束时,必须使用from demo import * 这种方式导入,该导入方式是和 __all__配套使用!)
from demo import * # 必须以这种方式导入模块 才可以被__all__中的列表约束 print(money) # 因为money已经在demo.py的__all__列表中,所以可以被使用~ func() # 因为func也已经在__all__列表中,所以也可以被调用
运行结果:
但是:
from demo import * # 必须以这种方式导入模块 才可以被__all__中的列表约束 # print(money) # 因为money已经在demo.py的__all__列表中,所以可以被使用~ # func() # 因为func也已经在__all__列表中,所以也可以被调用 func2() # 由于该函数名func2并不在demo.py 的__all__中,所以并不能在当前文件中被执行(NameError: name 'func2' is not defined)
运行结果:
__name__,在一个模块中有__name__ 当我们执行该模块时,__name__是__main__,但是当别的模块导入该模块时,在别的模块运行__name__就变为这个被引用的模块名
demo.py:
print(__name__) # 该__nmae__在demo.py中运行时,会输出__main__ 但是该demo.py被其他文件引用时,就会显示demo 就是这个被引用模块的模块名
运行该demo.py文件
然后在别的文件中导入该demo模块:
import demo print("这里是02.pyw文件中运行结果")
运行结果:
所以如果我们有一个需求,就是在有一个模块比如用户登录模块单独封装在一个py文件(写好了一系列接口,就是定义了很多和登陆操作相关的函数)中,当我们在该文件中运行时会执行相应代码(比如一些函数的调用,打印语句),但是别人写的一些别的py文件 比如购物车程序需要用到用户登录,也就是得用到之前写好的模块(py文件),但是我又不想打印原来那个函数的一些信息,只是想调用几个接口(函数),应该怎么做呢?
demo.py:
def welcome(): print("欢迎光临~") def login(): print("正在登录....") def login_sucess(): print("恭喜您,登录成功~") def bye(): print("再见,欢迎下次光临~") print(__name__) # __name__在该文件中运行时会打印__main__,当该文件被别的文件调用时,会输出demo 也就是这个被导入的模块名 if __name__=='__main__': print("这些代码,是只想在本py文件中输出,在被的文件中调用该py文件时 是不会显示的,因为别的文件运行时,__name__是demo 不是__main__") welcome() login() login_sucess() bye()
运行demo.py文件:
注意 此时在demo.py中运行时 __name__的值是__main__
02.py:(导入demo.py模块)
import demo print("之前在demo.py文件中位于if __name__=='__main__'中的代码都不会被执行~")
运行该02.py文件:
注意导入demo.py在02.py中运行时 demo.py中的__name__显示demo (也就是被引用的这个模块的模块名)
__name__直接在写改语句的文件中执行是__main__,在别的py文件中导入该文件时 在别的文件中运行结果是被导入的这个模块的名字,效果是不一样的!