前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python升级之路( Lv10 ) 模块

Python升级之路( Lv10 ) 模块

作者头像
时间静止不是简史
发布2022-07-09 13:07:13
9870
发布2022-07-09 13:07:13
举报
文章被收录于专栏:Java探索之路Java探索之路

Python系列文章目录

第一章 Python 入门

第二章 Python基本概念

第三章 序列

第四章 控制语句

第五章 函数

第六章 面向对象基础

第七章 面向对象深入

第八章 异常机制

第九章 文件操作

第十章 模块


模块化程序设计

前言

在本章, 我们首先认识了模块. 学习其相关命名规范, 标准库模块以及模块化编程的流程 然后, 我们学习了模块了模块导入的四种方式以及Python对模块导入所进行的优化 再然后, 我们学习了包, 以及如何导包和导包的本质 最后, 我们认识什么是库, 标准库以及第三方拓展库以及安装拓展库的两种方式


一、什么是模块

关于Python 中包, 模块, 类, 方法以及语句之间的关系如下图所示:

模块和包

注意事项:

  • Python程序由包和模块组成. 一个模块对应python源文件,一般后缀名是: .py
  • 模块由语句组成. 运行Python程序时,按照模块中语句的顺序依次执行
  • 语句是Python程序的构造单元,用于创建对象、变量赋值、调用函数、控制语句等

命名规范

本段参考自博主: 小威W, 附原文链接

1. 包和模块命名

  • 模块推荐使用小写命名; 如果有多个单词, 尽量使用下划线隔开
  • 因为很多模块文件存与模块名称一致的类,模块采用小写,类采用首字母大写,这样就能区分开模块和类

除模块命名外, 其他结构命名规范

2. 类命名

  • 类名使用驼峰(CamelCase)命名风格,首字母大写;
  • 私有类可用一个下划线开头

3. 函数命名

  • 函数名一律小写,如有多个单词,用下划线隔开
  • 类内部函数命名,用单下划线(_)开头(该函数可被继承访问)
  • 类内私有函数命名,用双下划线(__)开头(该函数不可被继承访问)

4. 变量命令

  • 变量名推荐小写,如有多个单词,用下划线隔开
  • 类内部变量命名,用单下划线(_)开头(该变量可被继承访问)
  • 类内私有变量命名,用双下划线(__)开头(该变量不可被继承访问)

5. 常量命令

  • 使用下划线分割并以大写字母命名

标准库模块

与函数类似,模块也分为标准库模块和用户自定义模块 Python标准库提供了操作系统功能、网络通信、文本处理、文件处理、数学运算等基本的功能.:

比如:

  • random(随机数)
  • math(数学运算)
  • time(时间处理)
  • file(文件处理)
  • os(和操作系统交互)
  • sys(和解释器交互)…

Python还提供了海量的第三方模块,使用方式和标准库类似。功能覆盖了我们能想象到的所有领域,

比如:

  • 科学计算
  • WEB
  • 开发
  • 大数据
  • 人工智能
  • 图形系统等

模块化编程

背景

模块(module)对应 Python源代码文件(.py文件). 模块中可以定义变量、函数、类、普通语句. 这样,我们可以将一个Python程序分解成多个模块,便于后期的复用

优点:

  • 便于将一个任务分解成多个模块,实现团队协同开发,完成大规模程序
  • 实现代码复用. 一个模块实现后,可以被反复调用
  • 可维护性增强

流程

  • 设计API,进行功能描述
  • 编码实现API中描述的功能
  • 在模块中编写测试代码,并消除全局代码。
  • 使用私有函数实现不被外部客户端调用的模块函数

模块的API和功能描述要点

  • API(Application Programming Interface 应用程序编程接口)是用于描述模块中提供的函数和类的功能描述和使用方式描述
  • 模块化编程流程可以简化为: 设计->实现->编写->调用

查看模块使用方式

创建和测试

每个模块都有一个名称,通过特殊变量 __name__ 可以获取模块的名称. 在正常情况下,模块名字对应源文件名. 仅有一个例外,就是当一个模块被作为程序入口时(主程序、交互式提示符下),它的__name__ 的值为 __main__ . 我们可以根据这个特点,将模块源代码文件中的测试代码进行独立的处理.

例如

代码语言:javascript
复制
import math
print(math.__name__)    #输出'math'

实操代码: 通过 __name==“__main__” 独立处理模块的测试代码

代码语言:javascript
复制
# 模块名: mypy12_salary_module.py
"""
本模块用于计算公司员工的薪资
"""
company = "jssxd"


def yearSalary(mouthSalary):
    """根据传入的月薪, 计算出年薪"""
    return mouthSalary * 12


def daySalary(mouthSalary):
    """根据传入的月薪, 计算日薪"""
    return mouthSalary / 22.5  # #国家规定每个月的平均工作日是22.5


if __name__ == "__main__":  # 测试代码
    print(yearSalary(30000))
    print(daySalary(30000))

模块文档字符串&API设计

我们可以在模块的第一行增加一个文档字符串,用于描述模块的相关功能. 然后,通过 __doc__ 可以获得文档字符串的内容.

实操代码: 设计计算薪水模块的API

代码语言:javascript
复制
# 模块名: mypy12_salary_module.py
"""
本模块用于计算公司员工的薪资
"""
company = "jssxd"


def yearSalary(mouthSalary):
    """根据传入的月薪, 计算出年薪"""
    return mouthSalary * 12


def daySalary(mouthSalary):
    """根据传入的月薪, 计算日薪"""
    return mouthSalary / 22.5  # #国家规定每个月的平均工作日是22.5

调用代码

代码语言:javascript
复制
# 模块名: mypy12_testImport_module.py
import mypy12_salary_module		

print(mypy12_salary_module.__doc__)		# 获取类注释内容
print(mypy12_salary_module.yearSalary.__doc__)		# 通过类.方法获取对应方法的注释内容

二、模块的导入

模块的导入就是“在本模块中使用其他模块”

import 导入

import 语句的基本语法格式如下:

  • import 模块名 # 导入一个模块
  • import 模块1,模块2… # 导入多个模块
  • import 模块名 as 模块别名 # 导入模块并使用新名字

import 加载的模块分为四种类型:

  • 使用python编写的代码 .py文件
  • 已被编译为共享库或 DLL 的C或C++扩展
  • 一组模块的包
  • 使用C编写并链接到python解释器的内置模块

注意事项:

from…import导入

  • 基本语法格式如下:from 模块名 import 成员1,成员2,…
  • 如果希望导入一个模块中的所有成员,则可以采用如下方式:from 模块名 import * 但你不知道你导入什么名字,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差, 一般生产环境中尽量避免使用

实操代码:

代码语言:javascript
复制
from math import pi,sin
print(sin(pi/2))    #输出1.0

import语句和from…import语句的区别

  • import 导入的是模块
  • from...import 导入的是模块中的函数/类

实操代码: 自定义一个模块 calculator.py

代码语言:javascript
复制
# mypy13_calculator.py
"""一个实现四则运算的计算器"""


def add(a, b):
    return a + b


def minus(a, b):
    return a - b


class MyNum():

    def print666(self):
        print(666)

在另一个模块 mypy13_test.py 测试

代码语言:javascript
复制
import mypy13_calculator as calculator

a = calculator.add(222, 444)
add(100,200)       # 不加模块名无法识别, 报错: NameError: name 'add' is not defined
print(a)

from 模块名 import * (不推荐使用)

代码语言:javascript
复制
from mypy13_calculator import *
a = add(222, 444)   # 无需模块名,可以直接引用里面的函数/类
print(a)

b = MyNum()
b.print666()

__import__() 动态导入

import 语句本质上就是调用内置函数 __import__() ,我们可以通过它实现动态导入

实操代码: 使用 import() 动态导入指定的模块( 不推荐 )

代码语言:javascript
复制
s = "math"
m = __import__(s)   # 导入后生成的模块对象的引用给变量m
print(m.pi)

注意事项:

模块的加载问题

当导入一个模块时, 模块中的代码都会被执行. 如果再次导入这个模块,则不会再次执行 者为什么这么设计?因为导入模块更多的时候需要的是定义模块中的变量、函数、对象等. 这些并不需要反复定义和执行. “只导入一次 import-only-once ”就成了一种优化. 参考设计模式的单例模式思想 核心: 一个模块无论导入多少次,这个模块在整个解释器进程内有且仅有一个实例对象(单例)

重新加载

有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload() 方法

实操代码

代码语言:javascript
复制
# mypy14_module_load.py
print("当前模块被加载了...")
代码语言:javascript
复制
# mypy14_test.py
import mypy14_module_load  # 不会再执行test02模块中的语句
import mypy14_module_load  # 会执行test02模块中的语句

print("####")
import importlib
importlib.reload(mypy14_module_load)  # 有时候我们确实需要重新加载一个模块,这时候可以使用:importlib.reload() 方法:

三、包(package)

概念和结构

当一个项目中有很多个模块时,需要再进行组织. 我们将功能类似的模块放到一起,形成了“包”. 本质上,“包”就是一个必须有 __init__.py 的文件夹. 典型结构如下:

包下面可以包含“模块(module)”,也可以再包含“子包(subpackage)”. 就像文件夹下面可以有文件,也可以有子文件夹一样

pycharm中创建包

按照上面图片的格式去建包. 在要创建包的地方单击右键: New–>Python package 即可 pycharm会自动帮助我们生成带有 __init__.py 文件的包。

导入包操作和本质

常见方式如下:

  • import a.aa.module_AA : 按模块路径导入 在使用时,必须加完整名称来引用. 比如: a.aa.module_AA.fun_AA()
  • from a.aa import module_AA: 按包路径导入模块 在使用时,直接可以使用模块名. 比如: module_AA.fun_AA()
  • from a.aa.module_AA import fun_AA照模块路径导入指定类or方法 在使用时,直接可以使用函数名。 比如: fun_AA()

注意事项:

  • from package import item 这种语法中, item 可以是包、模块,也可以是函数、类、变量(对照方式23)
  • import item1.item2 这种语法中, item 必须是包或模块,不能是其他(对照方式1)

实操代码

代码语言:javascript
复制
# 方式一: 按模块路径导入
import com.time.pause.capture2.module.a.aa.module_AA

print(com.time.pause.capture2.module.a.aa.module_AA.add(10, 20))

# 方式二: 按包路径导入模块
from com.time.pause.capture2.module.a.aa import module_AA

print(module_AA.add(10, 20))

# 方式三: 按照模块路径导入指定类or方法
from com.time.pause.capture2.module.a.aa.module_AA import add
add(10, 20)

import com.time.pause.capture2.module.a

导入包的本质

其实是“导入了包的 __init__.py ”文件. 也就是说 import pack1 意味着执行了包 pack1 下面的 __init__.py 文件. 这样可以在 __init__.py 中批量导入我们需要的模块,而不再需要一个个导入.

实操代码: 测试包的 __init__.py 文件本质用法

a 包下的 __init__.py 文件添加如下内容:

代码语言:javascript
复制
import turtle
import math

print("导入a包")

b 包下的 module_B1.py 文件中导入 a 包,添加代码如下:

代码语言:javascript
复制
import com.time.pause.capture2.module.a

print(com.time.pause.capture2.module.a.math.pi)
# 如上测试我们可以看出python的设计者非常巧妙的通过__init__.py 文件将包转成了模块的操作

用 * 导入包

import * 这样的语句理论上是希望文件系统找出包中所有的子模块,然后导入它们. 尽管提供 import * 的方法,仍不建议在生产代码中使用这种写法 Python 解决方案是提供一个明确的包索引. 这个索引由 init.py 定义 all 变量,该变量为一个列表, 如上例 a包下的 __init__.py 中,可定义 __all__ = ["module_A","module_A2"]

四、库(Library)

模块和包侧重于代码组织,有明确的定义. 库强调的是功能性,而不是代码组织. Python中库是借用其他编程语言的概念,没有特别具体的定义. 我们通常将某个功能的“模块的集合”,称为库

标准库

Python拥有一个强大的标准库。Python语言的核心只包含数字、字符串、列表、字典、文件等常见类型和函数, 而由Python标准库提供了系统管理、网络通信、文本处理、数据库接口、图形系统、XML处理等额外的功能

目前学过的有:random、math、time、file、os、sys等模块

  • random模块实现随机数处理
  • math模块实现数学相关的运算
  • time模块实现时间的处理
  • file模块实现对文件的操作
  • OS模块实现和操作系统的交互
  • sys模块实现和解释器的交互

第三方扩展库

强大的标准库奠定了python发展的基石,丰富和不断扩展的第三方库是python壮大的保证. 我们可以进入PyPI官网搜索标准库 传送门 想要了解 python 常用第三方库请见 这里

PIP模块管理工具

pip 是一个现代的,通用的Python包管理工具。提供了对 Python包的查找、下载、安装、卸载的功能

安装第三方扩展库的2种方式

第一种方式:命令行下远程安装
第二种方式:Pycharm中直接安装到项目中
  1. 在Pycharm中,依次点击: file–>setting–>Project 本项目名–>Project Interpreter 点击 + ,然后输入要安装的第三方库 pymysql ,再点击按钮 InstallPackage ,等待安装即可,几秒种后,即提示安装成功
  1. 提示成功后, 我们就可以在项目中直接使用第三方库pymysql了

注意:

在下载标准库模块时, 如果下载的标准库模块版本和当前自己安装的Python 版本不一致, 可能会导致下载失败.

解决方案:

可以在使用pycharm时, 不指定安装版本. 这样pycharm可以自动匹配合适版本并下载

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-07-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python系列文章目录
    • 模块化程序设计
    • 前言
    • 一、什么是模块
      • 模块和包
        • 命名规范
      • 标准库模块
        • 模块化编程
          • 背景
          • 流程
          • 创建和测试
          • 模块文档字符串&API设计
      • 二、模块的导入
        • import 导入
          • from…import导入
            • import语句和from…import语句的区别
              • __import__() 动态导入
                • 模块的加载问题
                • 三、包(package)
                  • 概念和结构
                    • pycharm中创建包
                      • 导入包操作和本质
                        • 用 * 导入包
                        • 四、库(Library)
                          • 标准库
                            • 第三方扩展库
                              • PIP模块管理工具
                                • 安装第三方扩展库的2种方式
                            相关产品与服务
                            Prowork 团队协同
                            ProWork 团队协同(以下简称 ProWork )是便捷高效的协同平台,为团队中的不同角色提供支持。团队成员可以通过日历、清单来规划每⽇的工作,同时管理者也可以通过统计报表随时掌握团队状况。ProWork 摒弃了僵化的流程,通过灵活轻量的任务管理体系,满足不同团队的实际情况,目前 ProWork 所有功能均可免费使用。
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档