1.模块的定义
➢ 模块就是一个保存了Python代码的文件。模块能定义函数、类和变量。模块里也能包含可执行的代码。
➢ 模块是Python中最高级别的程序组织单元,它将程序代码和数据封装起来以便重用,而模块就对应Python中的程序文件(.py文件),一旦在一个.py文件中导入了其他模块之后就可以在这个文件中使用导入模块中的变量、函数或类等。
模块可以由以下两个语句和一个内置的函数 reload()导入。
➢ import:导入一个整体的模块
➢ from:从一个模块中获取一些特定的内容
➢ reload:在不中止Python程序的情况下,重新导入模块文件内容的方法
2.导入模块--(import/from/reload)
①import 导入整个模块
语法:
a.一行导入多个模块--import module1[, module2[,... moduleN]]
b.分开导入--
import module1 as m #重命名
import module2
导入顺序:
Python 标准库模块
Python 第三方模块
应用程序自定义模块
调用方式:
模块名.方法名/属性名
使用import语句导入的模块是存放在该模块的命名空间中的,所以在调用模块使用时,必须使用【模块名.方法名/属性名】的格式进行访问
例--同级目录:模块的调用--直接调用
test01.py
a=1
def add(a,b):
return a+b
class P(object):
value=100
test02.py
import test01#导入test01模块,模块名是文件名,不加后缀
print (test01.a)#调用时
print (test01.add(1,2))
print(test01.P.value)
②from-import语句
语法:
from module import name1[, name2[,... nameN]]
调用方式:
使用from…import…这种方法导入模块后,由于是导入到了当前.py文件命名空间中 ,所以就可以直接使用模块中的函数或属性,不需要再使用“模块名.函数名”来调用模块中的函数了,直接访问函数名或属性名即可。
特记:
from module import *---导入某模块所有的内容
不推荐使用原因:假如后引入的模块中如果跟先引入的模块中有同 名的属性或方法时,后引入的模块会覆盖先引入的模块中同名的内容。
可能使用场景:
1.目标模块中的属性非常多, 反复键入模块名很不方便, 例如 Tkinter (Python/Tk) 和 NumPy (Numeric Python) 模块, 可能还有 socket 模块。
2.在交互解释器下, 因为这样可以减少输入次数。
例:
import sys
sys.path.append("d:\\")
from test01 import a,add
print (a)
print (add(1,2))
import和from…import…的区别
1. import导入的是一整个模块,而from…import…导入的却是模块中某些特定的内容。
2. import导入的内容是存放在模块命名空间中的,而from…import…却是存放在当前命名空间中的。
3. 使用import导入的模块,访问其中的属性与方法时,需要使用模块名.方法名(或属性名等)。
4. 使用from…import…导入的模块,由于是导入到当前的命名空间中的,所以只需要直接使用属性名或方法名即可。
5. 当导入的多个模块中含有同名方法或属性时,如果使用import导入,后导入的同名方法或属性不会覆盖先导入的其他模块中的同名的方法或属性;如果使用 from…import…导入的,后导入的同名属性或方法会覆盖最先导入的其他模块中 的同名方法或属性。
③reload()
reload()内建函数可以重新导入一个已导入的模块,reload()需要从imp中引入
语法:
from imp import reload
reload(module)
模块必须是全部导入(不是使用 from-import), 而且它必须被成功导入。
另外 reload() 函数的参数必须是模块自身而不是包含模块名的字符串。也就是说必须类似 reload(sys) 而不是 reload('sys')。
reload()再次导入的模块,会再次被执行,跟import不同。
例:
test1.py
print("这是test1模块")
def add(x,y):
return x+y
test02.py
from imp import reload
import test1
print(test1.add(1,2))
reload(test1)
print(test1.add(1,3))
执行结果:
这是test1模块
3
这是test1模块
4
3.定位模块--4种方式
①同级目录--直接调用
②sys.path.append来添加引用模块的文件路径
③环境变量的pythonpath指定引用模块的文件路径,必须重启cmd
④在python安装路径下的site-packages的目录下添加该模块
4.当前文件作为模块引用时,main方法下的所有内容不会被调用的部分执行
test01.py
a=1
def add(a,b):
return a+b
class P(object):
value=100
if __name__ == "__main__":
print("我是test01模块")
test01.py
a=1
def add(a,b):
return a+b
class P(object):
value=100
print("我是test01模块")
test02.py
import sys
sys.path.append("d:\\")
from test01 import a,add
print (a)
print (add(1,2))
有main执行结果:#未执行if __name__ == "__main__":下的内容
1
3
无main执行结果:
我是test01模块
1
3
5.globals() 和 locals()
globals() 和 locals() 内建函数分别返回调用者全局和局部名称空间的字典。
在一个函数内部, 局部名称空间代表在函数执行时候定义的所有名字, locals() 函数返回的就是包含这些名字的字典。globals()会返回函数可访问的全局名字。
在全局名称空间下, globals() 和 locals() 返回相同的字典, 因为这时的局部名称空间就是全局空间
def foo():
print ("calling foo()...")
aStr = "bar"
anInt = 23
print ("foo()'s globals:", globals().keys())
print ("foo()'s locals:", locals().keys())
foo()
print ("__main__'s globals:", globals().keys())
print ("__main__'s locals:", locals().keys())
执行结果:
calling foo()...
foo()'s globals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo'])
foo()'s locals: dict_keys(['anInt', 'aStr'])
__main__'s globals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo'])
__main__'s locals: dict_keys(['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__annotations__', '__builtins__', '__file__', '__cached__', 'foo'])