模块:
在介绍python包之前,先来了解下模块,一个.py文件就是一个模块(与node.js模块概念类似,一个.js文件就是一个模块),模块里边可定义变量、函数和类。
导入模块(module)
在python中模块分为自定义模块、内置模块、第三方模块,这篇文章我们着重聊下模块的引入。
在python中引入模块有两种方式:
1、import module1,module2,module3 ··· ···
package 文件夹
| |
| |
| |
| | ——————>m2.py ----> variable_name = 'm2'
| | ——————>m3.py ----> variable_name = 'm3'
|
|
m1.py
# 引入模块
improt package.m2,package.m3
print(package.m2.variable_name) # 'm2'
print(package.m3.variable_name) # 'm3'
上边代码,package文件夹与m1.py文件同级,package文件夹下有m2.py和m3.py文件,m2和m3文件中分别有一个变量,m1通过improt关键字引入m2和m3模块 。
有几个注意的地方:
1、使用import导入模块,如果不是同级模块,则需要写上 文件夹名 . 模块名
2、使用模块中的变量时,写法:文件夹名 . variable_name
3、如果模块嵌套很深,可以使用as作为路径的别名, alias . variable_name
import package1.package2.package3.m4 as m
# 使用m4中的变量
m.variable_name
2、from module import 变量名 或 函数 ----->从xxx模块引入xxx变量或xxx函数
from package.m4 import variable_name
#使用模块变量时,直接打印即可,无需写路径
print(variable_name)
(1)可以使用星号导入所有的变量
form module.m4 import *
#使用模块中的变量
print(variable_name1,variable_name2, ··· ···)
(2)也可以使用模块中的内置变量_ _all_ _来控制 * (也就是控制 * ,导入指定的变量)
# m4 模块
__all__ = ['a','b']
a = 1
b = 2
c = 3
form module.m4 import *
#使用模块中的变量
print(a) # 1
print(b) # 2
print(c) # 报错 c is not define
( 3 ) 多个变量的导入,可以使用括号
form module import (a,b,c,d,e ··· ···)
#使用模块中的变量
print(a,b,c,d ··· ···)
(4)也可以直接引入包
form package_name import m1
#使用模块中的变量
print(m1.variable_name)
包
在python中,包就是一个文件夹,包里边有模块(.py文件),模块里边有类,而类里边含有函数与变量。。。
当我们创建一个python包的时候,包里边必须含有一个_ _ init_ _.py文件,否则创建的文件夹与普通文件夹没区别;在每次执行引入的模块的时候,总会先执行_ _ init_ _.py文件,所以在实际开发中通常会把__ init__.py文件当做模块的初始化来用。。。
在这说下,__init__.py这个模块的名字就是包的名字(下边__init__.py模块的名字是package)
package 文件夹
| |
| |
| | ——————>__init__.py --> print('lxc')
| | ——————>m2.py --> variable_name = 'm2'
| | ——————>m3.py --> variable_name = 'm3'
|
|
m1.py
# 引入模块
form package.m2 import variable_name
print(variable_name)
# 打印顺序是:
# 'lxc'
# 'm2'
上边代码,我们在文件m1中引入的package下的m2模块,结果打印顺序:先打印 ‘ lxc ’ 后打印 ‘m2’,证明在执行引入的模块的时候,总会先执行__ init __ .py文件。
__init__.py文件作用:
一、上边我们说可以用python中内置变量__all__开控制 * 号,导入指定的变量或函数,同样,我们还可以在__init__.py文件中使用__all__内置变量,来控制 * 号,指定引入哪一些模块:
上边截图,我们在m.py文件中引入py_package包下的所有模块,在__init__.py中我们用内置变量__all__来指定引入m1模块,结果打印m2没被定义,因为m2没有被引入!!!
当然如果不用 * 号 我们手动的引入模块,在__init__.py来控制模块的引入,是无效的。
二、批量导入模块
假设有上百个文件需要导入相同的包,你当然不会去挨个文件引入相同的模块,这时可以把引入模块的事让__init__.py文件去做:
在__init__.py文件中,引入模块:
# 引入python内置模块
import os
import datatime
import sys
在需要执行模块的文件中,只需要引入包名(包的名子就是__init__.py的名字)即可:
# 引用包
import py_package
# 使用包中的模块
print(py_package.os)
print(py_package.datetime)
print(py_package.sys) # 1
注意:
包和模块不会重复被导入,如果重复导入只会执行一次
以上就是模块和包的大致用法,有不足之处,希望指正!