Python基础
- Python基础-PEP8: Python代码风格指南
- Python基础-面向对象(四)
- Python基础-面向对象(三)
- Python基础-面向对象(二)
- Python基础-面向对象(一)
- Python基础-模块
- Python基础-异常的捕获和处理
- Python基础-文件夹的操作
- Python基础-文件的操作
- Python基础-函数(三)
- Python基础-函数(二)
- Python基础-函数(一)
- Python基础-字符串,元组,列表,字典,集合之间的相互转
- Python基础-字符串,元组,数组,字典-公共方法
- Python基础-集合set
- Python基础-字典
- Python基础-元组
- Python基础-列表
- Python基础-字符串
- Python基础-break和continue
- Python基础-for循环
- Python基础-while循环
- Python基础-if判断语句
- Python基础-数据类型转换,ASCII码对照表
- Python基础-运算符
- Python基础-输出print和输入input
- Python基础-标识符和关键字
- Python基础-变量以及类型
- Python基础-注释的引入
- Python基础-第一个python程序
- Python基础-简介
Python基础-模块
Python中的模块和包
什么是模块?
模块:在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块。说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块
import
在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入。
形如:import module1,mudule2...
当解释器遇到import语句,如果模块在当前的搜索路径就会被导入。
在调用模块中的函数时,必须这样引用:模块名.函数名,因为在多个模块中含有相同名称的函数,此时如果只是通过模块名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名
因此,有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:from 模块名 import 函数名1,函数名2.... 。注意:通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数。
如果想一次性引入math中所有的东西,还可以通过from math import *来实现,这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。
as用法:比如import random as r,相当于把random重命名为r,代码调用的时候,用r就可以了。
定位模块
当你导入一个模块,Python解析器对模块位置的搜索顺序是:
1,当前目录
2,如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
3,如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
4,模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。
定义自己的模块
1,在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字。比如有这样一个文件test.py,在test.py中定义了函数add:
def add(a,b):
return a+b2,调用自己定义的模块,那么在其他文件中就可以先import test,然后通过test.add(a,b)来调用了,当然也可以通过from test import add来引入
测试模块
在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息,例如:test.py代码如下:
def add(a, b): return a + b # 用来进行测试 if __name__ == '__main__': # 这句话意思是在本文件运行时才会显示下面的代码,其他文件调用这个文件时是不显示的 ret = add(12, 22) print('测试:12+22=%d' % ret)
模块中的__all__
1,没有__all__。test.py文件代码如下:
class Test(object): def test(self): print('Test类中的test函数') def test1(): print('---test1函数---') def test(): print('---test2函数---')
main.py代码如下:
from tests import * a= Test() a.test() test1() test2() '''输出结果 Test类中的test函数 ---test1函数--- ---test2函数--- '''
2,有__all__。test.py文件代码如下:
__all__ = ['Test','test1'] class Test(object): def test(self): print('Test类中的test函数') def test1(): print('---test1函数---') def test(): print('---test2函数---')
main.py代码如下:
from tests import * a= Test() a.test() test1() test2() '''输出结果 Test类中的test函数 ---test1函数--- Traceback (most recent call last): File "/home/python/Desktop/pc/pc/apps/contents/t.py", line 5, in <module> test2() NameError: name 'test2' is not defined '''
总结:如果一个文件中有__all__变量,那么也就意味着这个变量中没有的元素,不会被from xxx import *时导入
Python中的包
1. 引入包
1.1 有2个模块功能有些联系
1.2 所以将其放到同一个文件夹下
1.3 使用import 文件.模块 的方式导入
1.4 使用from 文件夹 import 模块 的方式导入
1.5 在msg文件夹下创建__init__.py文件
1.6 在__init__.py文件中写入
1.7 重新使用from 文件夹 import 模块 的方式导入
总结:
包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包
有效避免模块名称冲突问题,让应用组织结构更加清晰关于__init__.py文件
__init__.py文件有什么用?__init__.py 控制着包的导入行为
__init__.py为空:仅仅是把这个包导入,不会导入包中的模块
在__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块
可以在__init__.py文件中编写语句,当导入这个包时,这些语句就会被执行
__init__.py文件:
最后修改:2020年2月29日 18:46