模块和包

模块

什么是模块?

定义:逻辑上就是一组功能的组合;实质上一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py后缀。

import加载的模块分为四个通用类别:

  • 使用python编写的代码(.py文件)

  • 已被编译为共享库或DLL的C或C++扩展;

  • 包好一组模块的包;

  • 使用C编写并链接到python解释器的内置模块;

如何使用模块?

想要使用模块,必须先要将模块加载进来,可以通过关键字 import 或 from进行加载;需要注意的是模块和当前文件在不同的命名空间中。

模块的构成

模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,为了避免同一个模块重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)

模块导入的过程

import 语句

想使用 Python 源文件,只需在另一个源文件里执行 import 语句,语法如下:

  1. import moduels(模块名字)

导入整个模块,这种导入方式比较占用内存

  1. import moduels (模块名字) as XX

    这里是导入整个模块的同时给它取一个别名,因为有些模块名字比较长,用一个缩写的别名代替在下次用到它时就比较方便

  2. from modules(模块名字) import func(方法)

    从一个模块里导入方法,你要用到模块里的什么方法就从那个模块里导入那个方法,这样占用的内存就比较少

    也可以用别名表示 : from modules(模块名字) import func(方法)as XX

  3. from package.modules import func(方法)

    从一个包的模块里导入方法 这个方法跟上面那种基本一样,占用的内存也比较少

    也可以用别名表示,from modules(模块名字) import func(方法)as XX

  4. from…..import *

    表示导入模块中所有的不是以下划线(_)开头的名字都导入到当前位置,大部分情况下我们的python程序不应该使用这种导入方式,因为*你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。

还有一点要说的是,如果使用* 的方式进行了导入,这时只想使用里面的某个或某些功能时,可以使用__ all__来进行约束;

注意:__ all__只是用来约束* 方式的,其他方式导入的话,不会生效;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#直接导入
import pandas

#加别名
import pandas as pd

# #看一下from.....import 的使用
from sys import modules
print(modules)


# #再看一下使用as引用这个模块的某个功能;
from matplotlib import pyplot as plt
#这样在之后我们要调用这个模块只需要用plt即可,相当于起别名。

包是一种组织管理代码的方式,包里放着模块

用于将模块包含在一起的一个文件夹

假如一个模块的名称是 A.B,那么他表示一个包 A中的子模块B 。

包的结构

  • /— 包 #顶层包

  • /—/— init.py 包的 #初始化顶层包

  • /—/— 模块1

  • /—/— 模块2

  • /—/— 子包

  • /—/—/— init.py 包的标志文件

  • /—/—/— 子包的模块1

包的导入操作

包的导入分为import和from…import…两种,但是无论哪种方式,在导入时必须都遵循一个原则:凡是在导入时带点的,点的左边必须是一个包,否则非法。在导入后使用时,就没有这些规则了,点的左边可以是包、模块、函数等(他们可以用点的方式调用自己的属性)。

包的本质就是文件夹,导入包就相当于导入包下的__ init__.py文件

下面我们具体看下包的导入有哪些方式

  1. import package_name

    直接导入一个包,可以直接使用__ init__.py的内容

    eg.import time, 用import直接导入python的time模块

  2. import package name as p

    具体用法跟作用方法,跟上面一致,相当于起别名

    注意的是此方法默认是对 __ init__.py的内容进行导入

  3. from … import …导

    from package import module,module2…..

    eg. from random import randint 即导入random包中的randint函数

    ​ from time import time,localtima 即从time包导入time函数和localtime函数

  4. from package import *

    导入指定包的所有内容

包和模块区别

包是比模块更高层的概念,模块一般是一个文件,包是一个目录,一个包中可以包含很多个模块。

包的all 定义在init.py文件中,模块的all定义在模块文件的开头

以下包用P表示,模块用M表示,方法用F表示

1
2
3
4
5
6
7
8
9
10
11
#在Python中引入模块可以用
import M
from M import *
from M import F

#引入包的方式可以是
import P
from P import M
from P import *
from P.M import F
from P1.P2.M import F

另外,包的init.py文件不能少。

概念说明

这里理清python中模块、库、包之间的概念差异

模块(module)其实就是py文件,里面定义了一些函数、类、变量等。

包(package)是多个模块的聚合体形成的文件夹,里面可以是多个py文件,也可以嵌套文件夹。

库是参考其他编程语言的说法,是指完成一定功能的代码集合,在python中的形式就是模块和包。

评论