15.模块-包-库

15.1 基本概念

    随着代码量的不断增多,一个文件里代码会越来越长,也不容易维护。为了解决这种问题,我们会进行拆分,并将具备类似的功能放同一文件中。这样每个文件包含的代码就相对较少。在Python中一个.py文件就称之为一个模块,英文叫(module)

    使用模块的好处如下所示:

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  • 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

本文地址:https://www.cnblogs.com/surpassme/p/13020585.html
本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:
 Python基础-15模块-包-库 Python

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄