模块的概念
一个包含python代码的文件就是一个模块。
模块的作用:
1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
创建模块
模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。
- 变量:模块中的属性值
- 函数:单独的功能
- 类:相似功能组合
- 模块测试代码:临时使用,被导入时不会执行
注意:
(1) 模块名称遵循标识符。
(2) 模块只有第一次被导入的时候执行,多次导入不会执行。
例如:model1.py是一个简单的模块
print('这是一个模块')
def hello():
print("hello")
在其他的地方需要使用这个模块的方法如下:
(不需要加.py)
import model
调动模块的结果是:
这是一个模块
使用model模块中的函数hello:
import model
mode.hello()
结果是:
这是一个模块
hello
模块导入的原理
原理介绍
- 模块导入会将要导入的文件执行一遍
- 导入模块的名称就是我们定义的脚本或包的名称
- 我们导入模块的过程总结就是:在指定的范围内搜索指定名称的python脚本或者包,将其运行,获取其中的方法
模块的导入方式
- import 模块名
- import 模块名 as 别名
- import 模块名1,模块名2,…(一行导入多个模块
- from…import…
- from…import…as 别名
- from…import 功能1,功能2,…
- from…import * (导入所有
1、import 模块名
import model
2、import 模块名 as 别名
import model as m
a.hello()
3、一行导入多个模块
import model,time,sys
4、from…import…(局部导入方式
from model import hello
hello()
注意:如果当前文件中的变量或者函数名称和模块中的名称重复,会使用就近原则。
from model import hello
hello() # hello
def hello():
print('123')
hello() # 123
5、支持导入多行
from model import test1,test2,test2
test1()
test2()
6、from…import…as 别名
当导入的模块和当前模块中的名称相同的时候可以起别名进行区分。
from model import hello as ho
ho()
7、from 模块 import *
作用:直接导入模块中的所有方法和类和变量
from model import *
test1()
test2()
注意:如果model.py中的命名开头是_,如_age,则from model import *不能导入_age
from model import *
test1()
test2()
print(_age) # 不能导入
__all __属性
格式如下:
__all __=[变量1,变量2…]
这样在另一个文件中用from model import *就能导入列表中规定的
例如:
def hello():
print(’hello...')
name='lee'
_age=21
__all__=['hello','name','_age']
引用这个模块:
from model import *
hello()
print(name)
print(_age) # 可以引用了
模块搜索路径
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
1、当前目录
2、如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
由sys模块的sys.path方法来规定
因为sys.path返回的数据类型是列表
1、列表可以修改、我们导入的范围也可以通过修改sys.path这个列表获得暂时的修改。例如通过 sys.path.append()添加目录,导入额外目录的模块。
2、列表是有序的,当搜索的过程当中,在第一个路径下搜索到了,就停止搜索。而且sys.path第一个路径是脚本的当前路径,所以禁止大家将自己的脚本命名成模块的名称。
因此需要注意的是:自己模块命名的时候不能和系统的模块名称相同。
pyc临时文件
为了提高加载模块的速度,python解释器会在__pycache__目录中下缓存每个模块编译后的版本,之后,再次被导入时,实际上导入的是这个.pyc的临时文件。
把模块当做脚本运行
我们可以通过模块的全局变量__name__来查看模块名:
当做脚本运行的时候:
__name __ 的值 等于’__main __’
当做模块导入的时候:
__name__的值等于模块名
作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
if __name __ == ‘__main __’:
示例:做脚本的时候测试代码会运行,而调用模块的时候测试代码不会运行
def sum_num(num1,num2):
sum=num1+num2
return sum
if __name__=='__main__':
ret=sum_num(1,2)
print(ret)