- #1 模块的创建">#1 模块的创建
- #2 模块的导入">#2 模块的导入
- #2.1
<font style="color:rgb(71, 101, 130);">import <module_name></font>
">#2.1<font style="color:rgb(71, 101, 130);">import <module_name></font>
- #2.2
<font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
">#2.2<font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
- #2.3
<font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
">#2.3<font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
- #2.4
<font style="color:rgb(71, 101, 130);">import <module_name> as <alt_name></font>
">#2.4<font style="color:rgb(71, 101, 130);">import <module_name> as <alt_name></font>
- #2.5 包含单个类的模块">#2.5 包含单个类的模块
- #2.6 包含多个类的模块">#2.6 包含多个类的模块
- #2.1
- #3 包">#3 包
- #3.1
<font style="color:rgb(71, 101, 130);">import <module_name>[, <module_name> ...]</font>
">#3.1<font style="color:rgb(71, 101, 130);">import <module_name>[, <module_name> ...]</font>
- #3.2
<font style="color:rgb(71, 101, 130);">from <package_name> import <modules_name>[, <module_name> ...]</font>
">#3.2<font style="color:rgb(71, 101, 130);">from <package_name> import <modules_name>[, <module_name> ...]</font>
- #3.3
<font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
">#3.3<font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
- #3.4
<font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
">#3.4<font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
- #3.5
<font style="color:rgb(71, 101, 130);">from <package_name> import <module_name> as <alt_name></font>
">#3.5<font style="color:rgb(71, 101, 130);">from <package_name> import <module_name> as <alt_name></font>
- #3.1
- #4 总结">#4 总结
- #5 练习题">#5 练习题
- Python 基础教程
- 简化问题求解
- 提高代码可维护性
- 提高代码可重用性
- 减少代码冲突
#1 模块的创建
模块的创建非常简单,一个 .py 文件便是一个模块(Module)。将下面的代码保存在<font style="color:rgb(71, 101, 130);">utils.py</font>
文件中,这个操作是非常简单的,只需要我们创建一个文件名为 utils 的 py 文件,然后将代码复制到 utils 的 py 文件中就完成了一个模块的创建。
1
# utils.py模块
def max_num(a, b):
if a >= b:
return a
else:
return b
def min_num(a, b):
if a > b:
return b
else:
return a
2
3
4
5
6
7
8
9
10
11
12
13 这样我们便创建了一个名为
<font style="color:rgb(71, 101, 130);">utils</font>
的模块,在这个模块中,定义了两个函数: <font style="color:rgb(71, 101, 130);">max_num</font>
和<font style="color:rgb(71, 101, 130);">min_num</font>
,两个函数分别为求两个数中的大数和小数。
#2 模块的导入
#2.1 <font style="color:rgb(71, 101, 130);">import <module_name></font>
模块创建完成后,可以使用 <font style="color:rgb(71, 101, 130);">import</font>
关键字来导入模块,例如:
1 我们看到通过
import utils
<font style="color:rgb(71, 101, 130);">import 模块名</font>
的方式完成了模块导入。
执行上述指令后,Python 首先会从自己内置模块中查找是否含有该模块的定义,若未查询到会从 <font style="color:rgb(71, 101, 130);">sys.path</font>
对应的模块路径查询是否含有对应模块的定义,如果搜索完成,仍然没有对应的模块时,则抛出 import 的异常。
也就是说当执行 <font style="color:rgb(71, 101, 130);">import utils</font>
这条指令时,Python 会从以下路径中搜索模块 <font style="color:rgb(71, 101, 130);">utils.py</font>
。
- 在当前目录下搜索该模块。
- 在环境变量
<font style="color:rgb(71, 101, 130);">PYTHONPATH</font>
指定的路径列表中依次搜索。 - 在 Python 安装路径的 lib 库中搜索。
<font style="color:rgb(71, 101, 130);">sys.path</font>
获得,该变量位于模块 <font style="color:rgb(71, 101, 130);">sys</font>
中。<font style="color:rgb(71, 101, 130);">sys.path</font>
是 Python 的一个系统变量,是 Python 搜索模块的路径列表。其获取的方法如下:
1
import sys
print(sys.path)
2
3 为了让创建的模块能够被找到,需要将模块放到上述路径中的一个,因为 Python 只会在这些路径中去查找模块,如果没有将模块创建在这些路径中,则找不到对应的模块,也就没办法应用模块中的对象和方法了。 现在呢,我们想要去调用模块
<font style="color:rgb(71, 101, 130);">utils</font>
中的 <font style="color:rgb(71, 101, 130);">max_num</font>
和 <font style="color:rgb(71, 101, 130);">min_num</font>
方法,第一步为导入模块 <font style="color:rgb(71, 101, 130);">utils</font>
,第二步为调用模块 <font style="color:rgb(71, 101, 130);">utils</font>
中的两个方法,具体语句如下:
1
#导入模块utils
import utils
print(utils.max_num(4, 5))
print(utils.min_num(4, 5))
2
3
4
5 我们看到为了调用模块中的函数
<font style="color:rgb(71, 101, 130);">max_num</font>
和 <font style="color:rgb(71, 101, 130);">min_num</font>
,需要在函数名前面添加 <font style="color:rgb(71, 101, 130);">utils.</font>
前缀。如果不添加 <font style="color:rgb(71, 101, 130);">utils.</font>
前缀 ,则会报错。
#2.2 <font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
下面,我们一起来看模块导入的另一种方法,直接导入模块中的对象,语句为:<font style="color:rgb(71, 101, 130);">from 模块名 import 方法名</font>
,我们一起看下方实例:
1
from utils import max_num, min_num
print(max_num(4, 5))
print(min_num(4, 5))
2
3
4 使用这种方式导入时,调用
<font style="color:rgb(71, 101, 130);">max_num</font>
和 <font style="color:rgb(71, 101, 130);">min_num</font>
函数便不需要添加前缀 <font style="color:rgb(71, 101, 130);">utils.</font>
。
有时候,为了方便,会使用 <font style="color:rgb(71, 101, 130);">from <module_name> import *</font>
来导入模块中的所有对象。
1
from utils import *
print(max_num(4, 5))
print(min_num(4, 5))
2
3
4
#2.3 <font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
大家在成长过程中,都会有一些别名,仓颉也有,仓颉又被称为“造字圣人”,“造字圣人”就是仓颉的别名。
Python 中模块内的对象和方法也可以有自己的别名,实现语句为: <font style="color:rgb(71, 101, 130);">from 模块名 import *** as 别名</font>
,该命令为导入的对象起一个别名。这样就可以通过别名来使用对象。例如:
1
from utils import max_num as max_n, min_num as min_n
print(max_n(4, 5))
print(min_n(4, 5))
2
3
4 在上面的例子中,分别为
<font style="color:rgb(71, 101, 130);">max_num,min_num</font>
取了别名 <font style="color:rgb(71, 101, 130);">max_n,min_n</font>
。这样在调用函数时,便可以使用 <font style="color:rgb(71, 101, 130);">max_n,min_n</font>
。
#2.4 <font style="color:rgb(71, 101, 130);">import <module_name> as <alt_name></font>
我们还可以为导入的整个模块起一个别名,这样便可以通过模块的别名来使用模块,使用方法是一样的,都是将 <font style="color:rgb(71, 101, 130);">模块名.</font>
作为前缀。例如:
1
import utils as ul
print(ul.max_num(4, 5))
print(ul.min_num(4, 5))
2
3
4 在上面的例子中,为模块
<font style="color:rgb(71, 101, 130);">utils</font>
取了别名 <font style="color:rgb(71, 101, 130);">ul</font>
,这样在调用函数时,便可以使用 <font style="color:rgb(71, 101, 130);">ul.</font>
前缀。
#2.5 包含单个类的模块
我们一起来看下包含单个类的模块,我们创建一个模块(car.py),包含类<font style="color:rgb(71, 101, 130);">car</font>
,语句如下:
1
class Car:
def __init__(self, mk, md, y, c):
self.make = mk
self.model = md
self.year = y
self.color = c
self.mileage = 0
def get_description(self):
description = f'{self.year} {self.color} {self.make} {self.model}'
print(description)
def get_mileage(self):
print(f"This car has {self.mileage} miles on it")
def update_mileage(self, mile):
self.mileage = mile
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 导入类(my_car.py):
1
from car import Car
my_car = Car('audi', 'a4', 2016, 'white')
my_car.get_description()
my_car.update_mileage(30)
my_car.get_mileage()
2
3
4
5
6
#2.6 包含多个类的模块
我们创建模块(car.py),其中包含父类<font style="color:rgb(71, 101, 130);">car</font>
和继承类 <font style="color:rgb(71, 101, 130);">Electriccar</font>
,语句如下:
1
class Car:
def __init__(self, mk, md, y, c):
self.make = mk
self.model = md
self.year = y
self.color = c
self.mileage = 0
def get_description(self):
description = f'{self.year} {self.color} {self.make} {self.model}'
print(description)
def get_mileage(self):
print(f"This car has {self.mileage} miles on it")
def update_mileage(self, mile):
self.mileage = mile
class ElectricCar(Car):
def __init__(self, mk, md, y, c):
super().__init__(mk, md, y, c)
self.battery_size = 100
def get_battery(self):
print(f"This car has {self.battery_size} -kWh battery.")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 导入单个类(my_electirc_car.py):
1
from car import ElectricCar
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')
my_tesla.get_description()
my_tesla.get_battery()
2
3
4
5 导入多个类(my_cars.py):
1
from car import ElectricCar, Car
my_car = Car('audi', 'a4', 2016, 'white')
my_car.update_mileage(30)
my_car.get_mileage()
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')
my_tesla.get_description()
my_tesla.get_battery()
2
3
4
5
6
7
8
9 导入整个模块:
1
import car
my_car = car.Car('audi', 'a4', 2016, 'white')
my_car.update_mileage(30)
my_car.get_mileage()
my_tesla = car.ElectricCar('tesla', 'model 3', 2018, 'white')
my_tesla.get_description()
my_tesla.get_battery()
2
3
4
5
6
7
8
9 导入模块中的全部类:
1
from car import *
my_car = Car('audi', 'a4', 2016, 'white')
my_car.update_mileage(30)
my_car.get_mileage()
my_tesla = ElectricCar('tesla', 'model 3', 2018, 'white')
my_tesla.get_description()
my_tesla.get_battery()
2
3
4
5
6
7
8
9
#3 包
仓颉在创造出文字之前,也摸索了很多办法,他先是在绳子上打结,用各种不同颜色的绳子,表示各种不同的牲口。但时间一长,就不奏效了。增加的数目在绳子上打个结很方便,而减少数目时,在绳子上解个结就麻烦了。仓颉又想到了在绳子上打圈圈,在圈子里挂上各式各样的贝壳,来代替他所管的东西。增加了就添一个贝壳,减少了就去掉一个贝壳。但是随着仓颉管理事情的增多,这个方法也不好用了,他只能寻找其他办法,有一天,他看到猎人用动物的脚印来判断动物的踪迹,受到启发,创造了用符号表示事物,也就是文字。 在程序中呢,也会遇到和仓颉一样的问题,就是假设我们开发了一个很庞大的应用程序,程序包含了非常多的模块。随着模块数量的增长,如果将模块都放在同一个目录下,将变得越来越难管理。特别当模块具有相似的名称或相似的功能。这时候我们非常希望对这些模块进行分组管理,Python 中的包实现了对模块分组管理的功能。包的创建非常简单,它利用了操作系统的分层文件结构。我们只要将模块放在一个目录下便可。<font style="color:rgb(71, 101, 130);">utils1.py</font>
和 <font style="color:rgb(71, 101, 130);">utils2.py</font>
,pkg 便是一个包。(包相当于一个文件夹,模块则相当于文件夹中的文件)
两个模块中的语句如下:(语句相当于文件中的内容)
<font style="color:rgb(71, 101, 130);">utils1.py</font>
:
1
def max_num(a, b):
if a >= b:
return a
else:
return b
def min_num(a, b):
if a > b:
return b
else:
return a
2
3
4
5
6
7
8
9
10
11
12
<font style="color:rgb(71, 101, 130);">utils2.py</font>
:
1
def sum_num(a, b):
return a + b
def abs_num(a):
if a >= 0:
return a
else:
return -a
2
3
4
5
6
7
8
9
#3.1 <font style="color:rgb(71, 101, 130);">import <module_name>[, <module_name> ...]</font>
导入包中的模块,语法规则为:<font style="color:rgb(71, 101, 130);">import 包.模块名</font>
,我们一起看下方语句:
1
import pkg.utils1
import pkg.utils2
print(pkg.utils1.max_num(4, 5))
print(pkg.utils2.sum_num(4, 5))
2
3
4
5 导入包
<font style="color:rgb(71, 101, 130);">pkg</font>
中的模块 <font style="color:rgb(71, 101, 130);">utils1</font>
和模块 <font style="color:rgb(71, 101, 130);">utils2</font>
,并调用两个模块中的方法,将 <font style="color:rgb(71, 101, 130);">pkg.utils1.</font>
作为前缀放在 <font style="color:rgb(71, 101, 130);">max_num()</font>
方法前,表示是在 pkg 包中的模块 <font style="color:rgb(71, 101, 130);">utils1</font>
内的方法。
#3.2 <font style="color:rgb(71, 101, 130);">from <package_name> import <modules_name>[, <module_name> ...]</font>
我们也可以通过 <font style="color:rgb(71, 101, 130);">from</font>
语句来实现模块的导入,我们一起看下方语句:
1
from pkg import utils1, utils2
print(utils1.max_num(4, 5))
print(utils2.sum_num(4, 5))
2
3
4
#3.3 <font style="color:rgb(71, 101, 130);">from <module_name> import <name(s)></font>
我们再来一起看下,定义包之后,导入指定模块中的对象,我们看下方语句:
1
from pkg.utils1 import max_num
print(max_num(4, 5))
2
3 和第二部分模块导入相比,就是在模块名前将包的名字作为前缀
<font style="color:rgb(71, 101, 130);">pkg.utils1</font>
来实现的,其余语句均与模块导入一致。
#3.4 <font style="color:rgb(71, 101, 130);">from <module_name> import as <alt_name></font>
为模块内的对象和方法设置别名,语句如下:
1
from pkg.utils1 import max_num as max_n
print(max_n(4, 5))
2
3
#3.5 <font style="color:rgb(71, 101, 130);">from <package_name> import <module_name> as <alt_name></font>
为导入的整个模块设置别名,语句如下:
1
from pkg import utils1 as ul1
print(ul1.max_num(4, 5))
2
3
#4 总结
本关,我们主要给大家介绍了模块和包,我们一起来回顾下本关内容:#5 练习题
自定义一个模块,并在另一个文件中导入这个模块。更新于: 12/30/2021, 2:46:39 AM