1. python 模块
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。(有点像java的class文件,一个class文件包含多个方法)
一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。
当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?
这就涉及到Python的搜索路径,搜索路径是由一系列目录名组成的,Python解释器就依次从这些目录中去寻找所引入的模块。
例如:模块结构如下:
代码如下:
StringUtils.py
"字符串工具栏"
def isBlank(str):
if str is None or '' == str:
return True;
else:
return False;
def isNotBlank(str):
return isBlank(str) == False;
知识兔NumberUtils.py
"数字工具栏"
def add(*args):
result = 0;
for ele in args:
result += ele;
return result;
知识兔下面的测试代码都是基于ModuleTest.py源代码进行
1. import语句
想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:
import module1[, module2[,... moduleN]
知识兔例如:
import cn.qlq.a.StringUtils as myStringUtils, cn.qlq.a.NumberUtils
if __name__ == '__main__':
print(myStringUtils.isNotBlank(''));
print(myStringUtils.title);
print(cn.qlq.a.NumberUtils.add(1, 2));
知识兔结果:
False
字符串工具栏
3
注意:
引入带包的模块的时候(比如上面的两个工具类),第一种方式用as起一个别名之后用别名访问(参考StringUtils);第二种是用包模块名全路径访问(参考NumberUtils)
不建议一行引入多个模块
2. from ... import ...语句
Python 的 from 语句让你从模块中导入一个指定的部分到当前命名空间中,语法如下:
from modname import name1[, name2[, ... nameN]]
知识兔例如:
import cn.qlq.a.NumberUtils
from cn.qlq.a.StringUtils import title
from cn.qlq.a.StringUtils import isBlank as isBlankFun
if __name__ == '__main__':
print(title);
print(isBlankFun('2'));
print(cn.qlq.a.NumberUtils.add(1, 2));
知识兔结果:
字符串工具栏
False
3
3. from … import * 语句
把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
from modname import *
知识兔这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
例如:
import cn.qlq.a.NumberUtils
from cn.qlq.a.StringUtils import *
if __name__ == '__main__':
print(title);
print(isBlank('2'));
print(cn.qlq.a.NumberUtils.add(1, 2));
知识兔结果:
字符串工具栏
False
3
这种方式有一个缺点就是最后引入的模块的方法或属性会覆盖之前引入的,例如:(后引入的NumberUtils的title属性会覆盖前面的)
from cn.qlq.a.StringUtils import *
from cn.qlq.a.NumberUtils import *
if __name__ == '__main__':
print(title);
print(isBlank('2'));
print(add(1, 2));
知识兔结果
数字工具栏
False
3
4. 深入模块
模块除了方法定义,还可以包括可执行的代码。这些代码一般用来初始化这个模块。这些代码只有在第一次被导入时才会被执行。
例如:
StringUtils.py修改为:
"字符串工具栏"
def isBlank(str):
if str is None or '' == str:
return True;
else:
return False;
def isNotBlank(str):
return isBlank(str) == False;
print("StringUtils 模块被引入")
知识兔NumberUtils.py修改为:
"数字工具栏"
def add(*args):
result = 0;
for ele in args:
result += ele;
return result;
print("NumberUtils 模块被引入")
知识兔ModuleTest.py测试:
from cn.qlq.a.StringUtils import *
from cn.qlq.a.NumberUtils import *
if __name__ == '__main__':
print(title);
print(isBlank('2'));
print(add(1, 2));
知识兔结果:
StringUtils 模块被引入
NumberUtils 模块被引入
数字工具栏
False
3
5. __name__属性
一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用__name__属性来使该程序块仅在该模块自身运行时执行。
例如:
"数字工具栏"
def add(*args):
result = 0;
for ele in args:
result += ele;
return result;
if __name__ == '__main__':
print("自身主函数运行");
else:
print("NumberUtils 模块被引入")
知识兔运行自身:
自身主函数运行
通过ModuleTest.py引入模块:
from cn.qlq.a.StringUtils import *
from cn.qlq.a.NumberUtils import *
if __name__ == '__main__':
print(title);
print(isBlank('2'));
print(add(1, 2));
知识兔结果:
StringUtils 模块被引入
NumberUtils 模块被引入
数字工具栏
False
3
6. dir() 函数
内置的函数 dir() 可以找到模块内定义的所有名称。以一个字符串列表的形式返回。如果没有给定参数,那么 dir() 函数会罗列出当前定义的所有名称。
ModuleTest.py代码如下:
import cn.qlq.a.StringUtils
if __name__ == '__main__':
print(dir(cn.qlq.a.StringUtils))
print(dir())
知识兔结果:
StringUtils 模块被引入
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'isBlank', 'isNotBlank', 'title']
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'cn']