Python基础---包

目录

 

一、包的基础知识

二、包的导入

import导入

from ... import ... 导入

__init__.py文件

from 包.模块 import *

三、包的相对和绝对导入

绝对导入

相对导入

四、import 导入自定义包的子模块

直接运行demo03_test02模块

在其他地方导入demo03_test02.py进行使用

五、包的单独导入


一、包的基础知识

在我们的项目中,可能会有太多的模块

但是我们不能把所有的模块这样放在这里,这样项目会乱七八糟。

我们可以将所有相同类型的模块放在一个文件夹中,这个文件夹就叫做包

包就是文件夹,他用于存放文件也就是模块。包中也可以存放包

包就是一个包含了__init__.py文件的文件夹。

包只是模块的一种形式而已,包即模块。

二、包的导入

1.关于包相关的导入语句也分为import和from ... import ...两种,但是无论哪种,无论在什么位置,在导入时都必须遵循一个原则:凡是在导入时带点的,点的左边都必须是一个包,否则非法。可以带有一连串的点,如demo01.demo02.demo03,但都必须遵循这个原则。

2.对于导入后,在使用时就没有这种限制了,点的左边可以是包,模块,函数,类(它们都可以用点的方式调用自己的属性)。

3.对比import demo和from demo import name的应用场景:
如果我们想直接使用name那必须使用后者。

import导入

import python1224.one.otest01

python1224.one.otest01.one_test01()

from ... import ... 导入

from 包名.模块名... import 变量名

使用方式: 例如 变量名() 或者print(变量名)

from 包名.模块名... import 变量名1,变量名2,...

使用方式: 例如 变量名1() 或者print(变量名2)

from 包名 import 模块名

使用方式:模块名.变量名() 或者 print(模块名.变量名)

from 包名 import 模块名,模块名1...

使用方式:模块名.变量名() 或者 print(模块名1.变量名)

需要注意的是

from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误

如:from a import b.c是错误语法

__init__.py文件

不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码

from 包.模块 import *

此处是想从包one中导入所有,实际上该语句只会导入包one下__init__.py文件中定义的名字,我们可以在这个文件中定义__all___:

使用__all__=[] 变量

三、包的相对和绝对导入

我们的最顶级包base是写给别人用的,然后在base包内部也会有彼此之间互相导入的需求,这时候就有绝对导入和相对导入两种方式:

绝对导入

以base作为起始起始(只能在一个包中使用,不能用于不同目录内)

相对导入

用.或者..的方式

四、import 导入自定义包的子模块

特别需要注意的是:

可以用import导入内置或者第三方模块(已经在sys.path中),但是要绝对避免使用import来导入自定义包的子模块(没有在sys.path中),应该使用from... import ...的绝对或者相对导入

直接运行demo03_test02模块

不会报错因为sys.path中已经添加了day05-包/demo03路径。

Import会从sys.path中依次搜索路径。

在其他地方导入demo03_test02.py进行使用

因为此时的sys.path中只有demo01-包.py的路径 .../day05-包,import demo03_test01 只能从/day05-包下查找 demo03_test01模块。找不到因此报错。

解决import 导入包时的报错问题

我们可以在sys.path中添加import搜索的路径

五、包的单独导入

单独导入包名称时不会导入包中所有包含的所有子模块

解决办法:需要从__init__.py中进行初始化操作

 

 

猜你喜欢

转载自blog.csdn.net/weixin_44239385/article/details/86152284
今日推荐