首页 > Python基础教程 > Python模块和包
阅读:2,391
Python创建包,导入包(入门必读)
掌握了包是什么之后,接下来继续学习如何创建和导入包。
例如,现在我们创建一个非常简单的包,该包的名称为 first_package,可以按照仿照以上 2 步进行:
由此,就创建好了一个包。之后,就可以向包中添加模块了(也可以添加包),这里给 first_package 包添加 2 个模块,分别是module1.py、module2.py,各自包含的代码分别如下所示(读者可直接复制下来):
另外,从以上输出结果可以看出,当导入指定包时,程序会自动执行该包所对应文件夹下的 __init__.py 文件中的代码。需要注意的是,当使用此语法格式仅导入包名时,例如:
我们知道,包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此:
当然,我们也可以使用 as 为导入的指定模块定义别名,例如:
同样,既然包也是模块,那么这种语法格式自然也支持
当然,也可以使用 as 为导入的成员起一个别名,例如:
另外,在使用此种语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员。例如:
Python包的创建
创建一个包,主要分为如下两步:- 创建一个文件夹,该文件夹的名字就是该包的包名。
- 在该文件夹内创建一个名为 __init__.py 的 Python 文件,在此文件中,可以不编写任何代码,也可以编写一些 Python 初始化代码,在此文件中编写的代码,其他程序文件导入包时,会自动执行(本节后续会有实例)。
例如,现在我们创建一个非常简单的包,该包的名称为 first_package,可以按照仿照以上 2 步进行:
- 创建一个文件夹,其名称设置为 first_package
-
在该文件夹中添加一个 __init__.py 文件,此文件中可以不编写任何代码,不过,本例中向该文件编写如下代码:
''' 这是学习包的第一个示例 ''' print('this is first_package')
可以看到,__init__.py 文件中,包含了 2 部分信息,分别是该包的说明文档和一条简单的输出语句。
由此,就创建好了一个包。之后,就可以向包中添加模块了(也可以添加包),这里给 first_package 包添加 2 个模块,分别是module1.py、module2.py,各自包含的代码分别如下所示(读者可直接复制下来):
#module1.py模块文件 display(n): print(n) #module2.py 模块文件 class Item: display(self): print("调用模块中类的方法")现在,我们就创建好了一个具有如下文件结构的包:
fk_package
┠── __init__.py
┠── module1.py
┗━━ module2.py
Python包的导入
再次强调,包的本质就是模块,因此导入包和导入模块的语法非常类似。无论导入我们自定义的包,还是导入从他处下载的第三方包,导入方法可归结为以下 3 种。-
import 包名[.模块名 [as 别名]]
-
from 包名 import 模块名 [as 别名]
-
from 包名.模块名 import 成员名 [as 别名]
与模块类似,包被导入之后,会在包目录下生成一个 __pycache__ 文件夹,并在该文件夹内为包生成一个 __init__.cpython-36.pyc 文件。
1) import 包名[.模块名 [as 别名]]
以前面创建好的 first_package 包为例,导入 module1 模块并使用该模块中成员可以使用如下代码:import first_package.module1 first_package.module1.display(20)运行结果为:
this is first_package
20
import first_package.module1 as module module.display(20)运行该程序会发现,其结果和上面完全一样。
另外,从以上输出结果可以看出,当导入指定包时,程序会自动执行该包所对应文件夹下的 __init__.py 文件中的代码。需要注意的是,当使用此语法格式仅导入包名时,例如:
import first_package first_package.module1.display(20)直接导入包名,并不会将包中所有模块全部导入到程序中,它的作用仅仅是导入并执行包下的 __init__.py 文件,因此,运行该程序,在执行 __init__.py 文件中代码的同时,还会抛出 AttributeError 异常(访问的对象不存在):
this is first_package
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\demo.py", line 2, in <module>
first_package.module1.display(20)
AttributeError: module 'first_package' has no attribute 'module1'
我们知道,包的本质就是模块,导入模块时,当前程序中会包含一个和模块名同名且类型为 module 的变量,导入包也是如此:
# 导入first_package包(模块) import first_package print('==========') print(first_package.__doc__) print(type(first_package)) print(first_package)运行结果为:
this is first_package
==========
这是学习包的第一个示例
<class 'module'>
<module 'first_package' from 'C:\\Users\\mengma\\Desktop\\first_package\\__init__.py'>
2) from 包名 import 模块名 [as 别名]
仍以导入 first_package 包中的 module1 模块为例,使用此语法格式的实现代码如下:from first_package import module1 module1.display(20)运行结果为:
this is first_package
20
当然,我们也可以使用 as 为导入的指定模块定义别名,例如:
from first_package import module1 as module module.display(20)此程序的输出结果和上面程序完全相同。
同样,既然包也是模块,那么这种语法格式自然也支持
from 包名 import *
这种写法,它和 import 包名 的作用一样,都只是将该包的 __init__.py 文件导入并执行。3) from 包名.模块名 import 成员名 [as 别名]
此语法格式用于向程序中导入“包.模块”中的指定成员(变量、函数或类)。通过该方式导入的变量(函数、类),在使用时可以直接使用变量名(函数名、类名)调用,例如:from first_package.module1 import display display(20)运行结果为:
this is first_package
20
当然,也可以使用 as 为导入的成员起一个别名,例如:
from first_package.module1 import display as a a(20)
另外,在使用此种语法格式加载指定包的指定模块时,可以使用 * 代替成员名,表示加载该模块下的所有成员。例如:
from first_package.module1 import * display(20)
所有教程
- socket
- Python基础教程
- C#教程
- MySQL函数
- MySQL
- C语言入门
- C语言专题
- C语言编译器
- C语言编程实例
- GCC编译器
- 数据结构
- C语言项目案例
- C++教程
- OpenCV
- Qt教程
- Unity 3D教程
- UE4
- STL
- Redis
- Android教程
- JavaScript
- PHP
- Mybatis
- Spring Cloud
- Maven
- vi命令
- Spring Boot
- Spring MVC
- Hibernate
- Linux
- Linux命令
- Shell脚本
- Java教程
- 设计模式
- Spring
- Servlet
- Struts2
- Java Swing
- JSP教程
- CSS教程
- TensorFlow
- 区块链
- Go语言教程
- Docker
- 编程笔记
- 资源下载
- 关于我们
- 汇编语言
- 大数据
- 云计算
- VIP视频