15.模块-包-库
15.1 基本概念
随着代码量的不断增多,一个文件里代码会越来越长,也不容易维护。为了解决这种问题,我们会进行拆分,并将具备类似的功能放同一文件中。这样每个文件包含的代码就相对较少。在Python中一个.py文件就称之为一个模块,英文叫(module)
使用模块的好处如下所示:
- 1.提高了代码的可维护性
- 2.提高了代码的可复用性,当一个模块编写完成之后,可以被其他地方引用。
- 3.使用模块还可以避免函数名称、变量名和类名等命名冲突。相同名字的函数、变量名、类名等可以放在不同的模块中,但要避免与内置函数名冲突
模块虽然解决了函数名、变量名和类名等命名冲突,那模块之前也会存在命名冲突的情况,应该怎么解决?为解决这个模块命名冲突,Python引入了按目录来组织模块的方法,称为包,英文(package)
举个例子,现在有两个py文件,分别为surpassA.py和surpassB.py,则相应的模块名即为surpassA和surpassB。如果这两个模块名与其他模块名存在冲突,则可以包来组织模块,使其成为包。方法是选择一个顶层包名,如surpass,按以下形式进行存放
surpass
|—— __init__.py
|—— surpassA.py
|—— surpassB.py
在引入包之后,只要顶层的包名没有冲突,则可以确保模块名不会产生冲突。则相应的模块名也由原来的模块名变更为surpass.surpassA和surpass.surpassB。
1.包的注意事项:每个包目录中必须存在__init__.py文件,否则Python会将视为普通目录,而非一个包。
2.__init__.py文件内容可以为空,也可以有相应的代码,其本身也是一个模块
类似这种情况,在一个包里面也是可以存在多个目录,组成多层级的包,示例如下所示:
surpass
|—— __init__.py
|—— surpassA.py
|—— surpassB.py
|—— config
| |—— __init__.py
| |—— surpassC.py
| |—— surpassD.py
|—— web
|—— __init__.py
|—— surpassE.py
|—— surpassF.py
以示例对应的模块名分别如下所示:
- surpassC:surpass.config.surpassC
- surpassA:surpass.surpassA
在Python中库是具有相关功能模块的集合,英文(library)。可分为以下三种形式:
- 标准库:Python内置库
- 自定义库:自己所写
- 第三方库:由他人所写或开源分享出来的
第三方库的安装,一般使用pip安装,其形式如下所示:
pip/pip3 install -U 库名
15.2 导入模块
Python自身内置了很多模块,只要安装完成后,即可以正常调用。导入模块的常见形式如下所示:
import 模块名
import 模块名 as 别名 # 在模块名称特别长的时候,可以简化调用所输入的模块名
import 模块名A,模块名B,模块名C,
from 模块名 import 函数名/类名 # 导入指定模块中的函数或类
from 模块名 import * # 导入指定模块中的所有内容,但排除以下划线开头的变量、函数等
引入某一特定路径下的模块,可使用sys.path.append(模块名),示例如下所示:
import sys
# 表示将上一层路径添加到sys.path中,在添加之后,解释器会搜索当前模块所在目录以及sys.path指定的路径去找需要import的模块
sys.path.append("..")
导入模块需要遵循的规则如下所示:
- 1.内置的模块优先导入并靠前
- 2.导入模块时,尽量少用from from 模块名 import *
- 3.不要重复导入同一模块,Python针对多次导入的模块,也仅执行一次
15.3 示例代码
person.py
class Person:
def __init__(self,name,age):
self._name=name
self._age=age
def getPerInfo(self):
print(f"name is {self._name},age is {self._age}")
mulClass.py
class Student:
def __init__(self, name, age,classNo):
self._name = name
self._age = age
self._classNo=classNo
def getPerInfo(self):
print(f"name is {self._name},age is {self._age},class NO. is {self._classNo}")
class Worker:
def __init__(self,name,occupation):
self._name=name
self._occupation=occupation
def getWorkerInfo(self):
print(f"name is {self._name},he/she is {self._occupation}")
class Teacher():
def __init__(self,name,classNO):
self._name=name
self._classNo=classNO
def getClassNo(self):
print(f"teacher's name is {self._name},His/Her's class is {self._classNo}")
def testFunc(name):
print(f"Hello, {name}")
main.py
import person
from mulClass import Student
from mulClass import testFunc
if __name__ == '__main__':
person=person.Person("Surpass",28)
person.getPersonInfo()
student=Student("Surpass",18,"Class-1")
student.getStudentInfo()
testFunc("testFunc")
输出结果如下所示:
name is Surpass,age is 28
name is Surpass,age is 18,class NO. is Class-1
Hello, testFunc
网友评论