百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

python的模块和包(python模块 包)

off999 2024-09-20 22:40 15 浏览 0 评论

没有学不会的python


前言

很长一段时间没更新博文了,不知道的人还以为我坚持不下去了呢,哈哈。说来惭愧,最近这段时间都忙着找工作,没什么时间更新这个系列的文章,导致停更了快一个月。其实每次都想着写一篇博文的,但每次都好像懒癌发作挺严重的,就没写了。

今天天气晴朗,梳了个油背头,决定老实坐在电脑面前码一篇文章。综合之前的更新进度以及我的更新计划,这次我们来讲讲python的模块和包。

模块与包

前面我们讲到的所有示例代码都是放在一个文件里面的,因为这些大部分都是demo(表示示例代码的意思),所以这样处理问题不大。但在实际开发中,我们往往要合理的组织各个函数的结构,不能一股脑的将所有的函数都放在一个py文件里面,由此就引申出了模块和包这两个概念。

包是一个更宽广的概念,它可以包含模块,而模块又可以包含非常多的函数、对象。因此,可以理解为包是一个模块的容器。

那使用包和模块有什么好处呢?

  1. 可维护性和拓展性。当我们合理的组织了代码的模块结构,日后如果需要拓展或者维护某个功能模块,我们就可以通过模块名称或者文档描述快速的定位到我们的目标模块或者函数,从而进行代码修改或拓展,而不影响其他模块的功能。
  2. 可复用性。我们可以将一个包或者单独的一个模块文件独立出来,提供给多个项目使用,从而把它从特定的项目中解绑出来。更好的地方是,我们可以将它上传到中央仓库以提供给任何需要使用的人或项目。
  3. 避免冲突。主要是避免函数名称和变量名称冲突。相同的函数名称和变量名称可以存在于不同的模块之中,而相同的模块名称又可以通过包名来加以区分,从而达到隔离的目的。
  4. 可读性强。当我们开始思考如何组织代码模块的时候,就会有目的的把相关的函数放在一起,从而可以通过文档描述更好地描述这个模块的功能。

关于包和模块的好处就讲这么多,对于不了解的朋友可能会不太能吸收这些意思,因为我们还没讲包和模块是怎么样的存在形式。所以看完了这篇文章后面的内容,最好回头看一下这几点重新理解一下

模块

在python中,一个.py文件就是一个模块。没错,之前我们写的代码都是一个模块文件。所以它的存在形式就是,当你看到一个py文件时,就要联想到它同时是一个模块,而这个模块里面的所有函数和变量是共用一个模块的。

自定义模块就是创建一个py文件啦。

包呢,其实就是一个文件目录,但它又不是普通的文件目录。区分包和文件目录的方法就是,每个包里面必定会有一个__init__.py文件。

模块和包的实践

这部分我们来实践一下,真正的认识模块和包的使用。假如我要创建一个包,用来处理日常的数据库连接操作,处理对象有MongoDB和MySQL两种数据库。那么我们就要创建一个名为DBUtils(名字随意,但是要符合实际用处,做到见名知意)的包,里面含有两个模块,分别命名为mongoDB_util和MySQL_util。步骤如下:

1、创建DBUtils目录。

可以看到图片上标注着两个箭头,这是两种创建包的方式,选其中一种就行了。区别在于,第一种不会自动创建__init__.py文件,需要手动创建。第二种则会自动创建__init__.py文件。建议第二种,省事。

2、在BDDButils目录下面新建一个__init__.py文件(如果用的是第二种方法,则跳过此步骤),说明这个文件目录是一个python包。

3、分别创建mongoDB_util和MySQL_util模块。此步和创建一般python文件没什么区别。

4、最后创建好的效果如下:

如何避免命名冲突

1、好的命名习惯

每个人都有自己的命名方式,但是一些好的命名习惯我们在平时要养成,这样才能尽量避免冲突。命名要尽量贴近实际功能,假如我们要创建一个函数用来添加日志信息,一般来说用(动作_对象)这样格式的命名方式会比较好。所以添加日志信息就是insert_logs或者add_logs。不要直接命名为logs。如果有不同的数据库处理对象,我们还可以加多一个后缀区分,比如insert_logs_mysql,表示是Mysql数据库中添加日志信息。

2、避免使用保留字

python中很多保留字,比如and/or/break等等这些。绝不允许使用保留字来命名函数或者变量。

3、引用模块时,为了避免和其它模块的变量产生冲突,要明确知道自己引用了什么。

比如下面的例子。

在mongoDB_util和MySQL_util文件分别新建一个con变量。并在mongoDB_util引用MySQL_util文件中的con变量。

mongoDB_util:

from DBUtils.MySQL_util import con

 con = "mongoDB"
 print(con)

MySQL_util:

con = "Mysql"

通过上述列子,我们可以试着运行mongoDB_util文件,你会发现con输出的是mongoDB,从而把从MySQL_util引入的con覆盖了。如果要用MySQL_util的con变量,应该这样使用:

from DBUtils.MySQL_util import con as mysql_con

con = "mongoDB"
print(con)
print(mysql_con)

即通过别名来重新命名,方式就是用as关键词,将con重新命名为mysql_con,这样就和本模块的con变量区分开来了。

通过上述方式可以很好的避免命名冲突,如果实际开发中发现某个变量输出的结果不是预期,可以留一下是否变量被覆盖了。

4、模块名称不要和python自带的模块名称冲突了。

比如系统自带了sys模块,我们就不要再命名一个sys的模块了,否则就会没办法导入系统的sys模块。

私有变量

可能我们还没有什么私有变量的概念。可以这么理解它,如果你希望一个函数(或者变量)可以被除了本模块之外的其它任意模块访问,则认为这个函数是公有函数(或者公有变量)。私有变量就是说,我希望我这个变量或者函数只能被本模块访问,而不被其它模块访问。

在java中有访问修饰符对变量进行访问限制,但是python却没有。不过大家都有一个遵守的规则就是,如果你要命名一个私有变量或者私有函数,你应该在名字前面加上一条下划线。

举例说明一下:

#通过在名字前面加_说明这个变量是私有变量
_private_val = "private"

#如果没有下划线就说明这个变量是可以被其它模块访问的
public_val = "public"

如果看过python源码的一些朋友可能会经常看到有双下划线+名字这样形式的函数。比如__init_()这样的。记住这些以双下划线开头和结尾的函数都是python系统自身的,我们不要模仿这样写法,因为我们要用这个特性区分系统函数和自定义函数。

两种不同的导入方式

python有两种不同的导入模块形式,分别是:

#用from的形式,可用as命名别名
from xxx import xxx
from xxx import xxx as xxx

#用from形式导入某个模块的所有对象。用*号表示所有对象
from xxx import *

#用import的形式,可用as命名别名
import xxx
import xxx as xxx

两种方式除了写法不一样以外,还有调用方式不同。最主要的本质区别是,所处的命名空间不一样。用from这样形式导入的变量或者函数会存在于本模块的命名空间中,因此有发生命名冲突的风险。因为这样,我们要避免全部导入某个模块的对象到本模块,不然会发生不可预知的问题。而用import这样形式的模块引入的对象,是不会和本地模块的对象冲突,因为它并不存在于本地模块中,而是存在于被引入的模块命名空间中。

比如上面讲的列子,就是用from引用MySQL_util中的con模块,由于这样引入的变量会存在于本模块中,因此和本模块的con变量发生了冲突,从而被本模块的con覆盖了。如果要避免这种冲突,就应该用as关键词命名别名,或者是用import的方式来引入。做个例子:

from DBUtils.MySQL_util import con as mysql_con
import DBUtils.MySQL_util

con = "mongoDB"

print(con)

# 使用from形式引入con
print(mysql_con)

# 使用import形式引入con
print(DBUtils.MySQL_util.con)

用import形式引入的模块,由于调用的时候必须通过包名.模块名.变量名称这样的形式调用,从而得以区分所调用的对象是来自哪个模块。

模块的搜索路径

默认情况下,python解释器是按照以下顺序查找我们要引入的模块的。首先是当前目录查找其次是python内置的模块查找最后是已安装的第三方模块。

要想查看python解释器的搜索路径,可以借助sys模块。

代码:

import sys
print(sys.path)

输出:

['D:\\code\\python\\blog', 'D:\\code\\python\\blog', 'D:\\软件安装\\python3.7 64\\python37.zip', 'D:\\软件安装\\python3.7 64\\DLLs', 'D:\\软件安装\\python3.7 64\\lib', 'D:\\软件安装\\python3.7 64', 'D:\\软件安装\\python3.7 64\\lib\\site-packages']

从输出的结果就可以查到python解释器寻找模块的路径。

引入模块的正确姿势

到这里基本就把python包与模块的基础知识讲完了,但是还有一些要注意的地方。

1、引入包的代码应该处于文件的顶部,而不可随意散落在文件的任意位置。

2、引入包的代码顺序应该是先python内置库再第三方库最后自己的库。

3、避免使用from xxx import *这样的引入方式。

感谢大家的阅读,如果喜欢我的文章可以关注我的公众号或者主页,关注一下,我会给你带来更多有用的博文。

相关推荐

Python 数据分析——利用Pandas进行分组统计

话说天下大势,分久必合,合久必分。数据分析也是如此,我们经常要对数据进行分组与聚合,以对不同组的数据进行深入解读。本章将介绍如何利用Pandas中的GroupBy操作函数来完成数据的分组、聚合以及统计...

python数据分析:介绍pandas库的数据类型Series和DataFrame

安装pandaspipinstallpandas-ihttps://mirrors.aliyun.com/pypi/simple/使用pandas直接导入即可importpandasas...

使用DataFrame计算两列的总和和最大值_[python]

【如果对您有用,请关注并转发,谢谢~~】最近在处理气象类相关数据的空间计算,在做综合性计算的时候,DataFrame针对每列的统计求和、最大值等较为方便,对某行的两列或多列数据进行求和与最大值等的简便...

8-Python内置函数

Python提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...

Python中函数式编程函数: reduce()函数

Python中的reduce()函数是一个强大的工具,它通过连续地将指定的函数应用于序列(如列表)来对序列(如列表)执行累积操作。它是functools模块的一部分,这意味着您需要在使用它之...

万万没想到,除了香农计划,Python3.11竟还有这么多性能提升

众所周知,Python3.11版本带来了较大的性能提升,但是,它具体在哪些方面上得到了优化呢?除了著名的“香农计划”外,它还包含哪些与性能相关的优化呢?本文将带你一探究竟!作者:BeshrKay...

最全python3.11版12类75个内置函数大全

获取全部内置函数:importbuiltins#导入模块yc=[]#异常属性nc=[]#不可调用fn=[]#内置函数defll(ty=builtins):...

软件测试笔试题

测试工程师岗位,3-5年,10-14k1.我司有一款产品,类似TeamViewer,向日葵,mstsc,QQ远程控制产品,一个PC客户端产品,请设想一下测试要点。并写出2.写出常用的SQL语句8条,l...

备战各大互联网巨头公司招聘会,最全Python面试大全,共300题

前言众所周知,越是顶尖的互联网公司在面试这一part的要求就越高,需要你有很好的技术功底、项目经验、一份漂亮的简历,当然还有避免不了的笔试过关。对于Python的工程师来说,全面掌握好有关Python...

经典 SQL 数据库笔试题及答案整理

马上又是金三银四啦,有蛮多小伙伴在跳槽找工作,但对于年限稍短的软件测试工程师,难免会需要进行笔试,而在笔试中,基本都会碰到一道关于数据库的大题,今天这篇文章呢,就收录了下最近学员反馈上来的一些数据库笔...

用Python开发日常小软件,让生活与工作更高效!附实例代码

引言:Python如何让生活更轻松?在数字化时代,编程早已不是程序员的专属技能。Python凭借其简洁易学的特点,成为普通人提升效率、解决日常问题的得力工具。无论是自动化重复任务、处理数据,还是开发个...

太牛了!102个Python实战项目被我扒到了!建议收藏!

挖到宝了!整整102个Python实战项目合集,从基础语法到高阶应用全覆盖,附完整源码+数据集,手把手带你从代码小白变身实战大神!这波羊毛不薅真的亏到哭!超全项目库,学练一站式搞定这份资...

Python中的并发编程

1.Python对并发编程的支持多线程:threading,利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成。多进程:multiprocessing,利用多核CPU...

Python 也有内存泄漏?

1.背景前段时间接手了一个边缘视觉识别的项目,大功能已经开发的差不多了,主要是需要是优化一些性能问题。其中比较突出的内存泄漏的问题,而且不止一处,有些比较有代表性,可以总结一下。为了更好地可视化内存...

python爬虫之多线程threading、多进程、协程aiohttp批量下载图片

一、单线程常规下载常规单线程执行脚本爬取壁纸图片,只爬取一页的图片。importdatetimeimportreimportrequestsfrombs4importBeautifu...

取消回复欢迎 发表评论: