py是什么意思?女生说处py是什么意思?

各位老铁,大家好,今天我们继续我们的Python学习,这不马上就到年底了吗,我在做各个项目的codereview,发现了一个问题,个别人员在项目合作过程中的代码结构组织的真是一塌糊涂,更有甚者一个py文件里写所有的五花八门的功能,虽说跑通了功能实现了,但是给人体验非常不好,尤其是后期维护,简直就是噩梦,正好我们还没有梳理Python里的模块,我们今天就先把模块梳理下,方便我们后续的学习。

最早我们学习python基础的时候,我们都是直接创建一个python文件,然后在python文件里顶格写我们的功能,最后直接运行,在这个文件里,可能涉及到语句块、方法、类。后续我们随着项目的开展,功能会越来越多,我们会把一类的语句块和方法放到一起,重新命名,逐渐的形成各个模块。功能使用者只需要知道你的模块叫什么,就可以直接引用。所以模块在我们后续项目合作力非常重要,另外python之所以这么火,很大一部分原因是,python有众多的开源模块,大家直接可以使用无需重新造轮子。

其实模块也可以看做是封装的过程,把我们实现的过程隐藏起来,对外提供一个接口,使用者直接可以使用我们的系统功能。在Python里,每个单独的py文件可以看做是一个模块,每个模块解决特定的一个功能。结合我们先前对python文件以及类的写法,我们可以看出,一个模块里可能包含多个类的。

Python里的模块可以分三部分,分别是自定义模块、系统内置模块和第三方模块。自定义模块就是我们自己写的模块,如果你写的好,那么自定义模块可以给别人用,对于别人来说,你的模块就是第三方模块了,如果你写的模块非常好,那么全世界都可以使用你的模块,python基金会会把你的模块放到python规范里,那么你的模块就成系统内置模块了。

Python里的模块最大好处是提高了代码的维护性和复用性。因为每次开发项目的时候,我们不需要重复的去写一些基础的功能,逐渐建立起自己的代码库,方便自己后续项目开展进行也是很好的开发习惯。

当你的系统需求比较复杂,模块数量非常多的时候,你还可以在模块的基础上继续进行抽象,整理系统的包结构。包是对模块的再划分,每个包里可以包含多个模块。后续我们想使用该模块,直接去调用该包即可。这里的包的存在形式就是目录结构。但是包与传统的目录结构又有区别。在ide里你创建了一个目录,就是创建了一个包,然后在该包下你再创建模块(模块就是py文件)。仔细观察你会发现,ide创建的每个包里都有一个__init__.py文件,没错,包含__init__.py的目录就是包。

在python里,没有比包结构更高的结构了,因此每个成熟的python项目,都是由一系列的包结构组成的,每个包里又包含一系列的模块。如果当前项目特别复杂,那么包结构可能会有嵌套。即目录里有另外的目录,

每个包我们都可以看做是一个独立的小世界,不同的包里允许存在同名的变量、方法、类等结构,而该同名的变量、方法、类都可以正常工作的。这样就可以避免在项目合作中出现命名冲突的问题。尤其涉及到系统集成的时候,包的管理非常有必要,及时出现重名的也不怕。我们在pycharm里创建几个包:

python里的包和模块是怎么回事

然后输入包的名字

python里的包和模块是怎么回事

注意,我们每次创建的包结构,里面都会默认有一个__init__文件,那么这个__init__.py有什么用呢?上次我们使用到__init__的时候是写类的构造函数的时候,那么这里的init模块是干嘛用的呢?

__init__.py文件首先是一个模块,我们可以往里写代码,但是非常不建议这么做,我们不要把业务逻辑的内容写到该文件里,这个习惯要逐渐建立起来。__init__模块首要的职责是标识当前目录是包结构,系统在文件里看到__init__.Py文件后,就认为该目录是一个包,如果目录里没有该文件,则该目录不是包。另外每个包里可能包含多个py模块,__init__模块也可以维护包里的模块供外部访问,一会我们会有demo演示。

注意:__init__.py模块里的代码不需要显示导入,导入包的时候会自动导入该模块。从这点来说,__init__.Py可以看做是包的构造函数?哈哈哈哈,理是这么个理,但是不能这么说啊,不严谨!

接下来我们在我们的basepackage包里添加两个模块。模块一内容如下:

python里的包和模块是怎么回事

上面我们也说了,一个模块我们就完成一个功能,这里我们定义了一个man,使用到了装饰器。创建完man这个模块后我们怎么使用他呢?

由于python里模块就是文件,因此我们想用这个模块,直接导入这个文件即可。Python里规定,我们可以这样引入我们的模块: import XX.XX

这里的XX.XX代表的是我们需要的模块在工程里的绝对路径,绝对路径是由包路径+模块名组成的,而这个包路径又可能有嵌套。下面我们创建一个新的模块student模块,在student模块里引用man块。

python里的包和模块是怎么回事

man模块和student模块在一个包下

python里的包和模块是怎么回事

你看这里的man.man看着多别扭,我们给man模块起一个新的名字吧。

给模块起新名的语法 import XX.XX as newmodelname

python里的包和模块是怎么回事

Import XX.XX 这种模式是把整个模块内容加载进来了,我们想访问里面的资源需要加载上模块的名字,比如man.man表示的是man模块里的man类。有时候,这个模块比较大,而我们使用的内容比较少,所以我们就想只加载我们需要的资源,其他的不用加载.那我们就可以使用另外一个模式来进行导入了。 语法为:from XX.XX import xx

From import的意思是从XX.XX模块里导入xx资源.我们可以直接使用该资源不需要模块的名字来引入了。我们再写个teacher类试下例如:

python里的包和模块是怎么回事

python里的包和模块是怎么回事

Python还支持第三种写法: from XX.XX import *.这种写法是直接导入XX.XX模块里的所有资源,这些资源可以直接使用,不用借助模块.资源的形式。但是这种写法最大的弊端就是可能会引起命名冲突,比如说当前资源里有个test类,你通过from XX.XX import *引入的资源里也包含一个test类,那么就会系统报错命名冲突了。但是如果能保证没有命名冲突,你完全可以通过这种写法导入我们需要的资源。

好了,到目前为止,我们在basepackage包里定义了三个模块,分别为 man模块、student模块、teacher模块,代码结构为:

python里的包和模块是怎么回事

接下来,我们再定义一个包结构apppackage,然后定义一个test模块,结构如下:

python里的包和模块是怎么回事

接下来,我们就通过apppackage包里的test来调用basepackage包里的三个模块。

在调用三个模块之前,我们复习下我们如何引用我们定义的包和模块:

Import XX.XX [as newname]—-这里需要指定模块的绝对路径,引入后再通过模块名.资源名进行访问,有可能引入多个资源

From XX.XX import xx [as newname]—- 从指定路径引入指定资源,有可能会造成命名冲突哦,引入后直接访问资源即可。

From XX.XX import * —- 从指定路径引入所有资源,引入后直接使用资源即可,但是有可能会有命名冲突。为何这里不能使用as newname呢?因为这里的资源太多了,没法重命名了。

另外一个模块只能被导入一次,如果多次导入,系统在第二次导入开始是不会执行的。防止我们系统资源浪费。

好,我们开始调用:

python里的包和模块是怎么回事

python里的包和模块是怎么回事

python里的包和模块是怎么回事

上述是我们三种调用引入形式的调用,大家需要认真分析,仔细总结。

可能还有人像下面那样进行调用

python里的包和模块是怎么回事

我们想把一个包里的所有资源都导入进来进行使用,为何没有识别出来呢?这里我们需要去basepackage里做下设置才行,否则没法直接使用。怎么设置呢?还记得我们刚才说过的__init__.py文件吗。这个文件第一个作用是 指定当前目录为包,有这个__init__.py文件的目录就是包。另外还有一个作用就是指定当前包里的访问资源,也就是from basepackage import *的时候的数据来源设置。好了我们去设置下,然后继续运行上述代码:

python里的包和模块是怎么回事

由于我们在basepackage包里的__init__.Py模块里做了__all__限定,我们的apppackage包里的test模块调用如下所示:

python里的包和模块是怎么回事

为啥teacher没有识别出来呢?因为__all__列表里没有他呗!

上述就是我们包模块的基本的使用,大家在开发项目的时候,记得自己的包名模块名不要跟系统、第三方包模块同名,尽量用自己的业务特色做包和模块拆分。

那如果系统里有自定义的包模块、系统包模块、第三方包模块,运行环境该如何去决定执行顺序呢?去哪里找系统包模块和第三方包模块呢?

其实,python去哪里找我们需要的资源取决于一个path系统变量,这个path变量被定义在了os系统模块里。我们打印下:

python里的包和模块是怎么回事

从上面的输出可以看出,系统会首先在自定义包模块(当前包、当前工程)里查找资源,然后会在系统定义的包模块里查找资源,最后才会在一些第三方库里查找资源。通过上述的搜索顺序,逐级的进行资源查询,找到了就使用,并且后续路径不会再寻找。如果都找不到就会报错。

好了,python工程项目里,基本就是上述我们所说的样子,大家要好好掌握,多看看开源项目,然后分析分析里面的工程结构,借鉴下大佬们的风格很有必要。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。不代表三优号立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1474187172@qq.com 举报,一经查实,本站将立刻删除。发布者:乔乔,转转请注明出处:https://www.uuuhao.com/34155.html

(1)
乔乔乔乔作者

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注