Python中的自定义模块有哪些部分呢?

绝对导入是指跳过包内,直接搜索 sys.path ,在sys.path的基础上进行我们的模块搜索。相对导入是指先包内,再包外,再,,,那么下面这篇文章主要给大家介绍了Python中的相对导入和绝对导入,需要的朋友可以参考借鉴,下面来一起看看吧。

Python 相对导入与绝对导入,这两个概念是相对于包内导入而言的。包内导入即是包内的模块导入包内部的模块。

  1. 在当前目录下搜索该模块
  2. 在环境变量 PYTHONPATH 中指定的路径列表中依次搜索

python 所有加载的模块信息都存放在 sys.modules 结构中,当 import 一个模块时,会按如下步骤来进行

相对导入可以避免硬编码带来的维护问题,例如我们改了某一顶层包的名,那么其子包所有的导入就都不能用了。但是 存在相对导入语句的模块,不能直接运行,否则会有异常:

 

这是什么原因呢?我们需要先来了解下导入模块时的一些规则:

在没有明确指定包结构的情况下,Python 是根据 __name__ 来决定一个模块在包中的结构的,如果是 __main__ 则它本身是顶层模块,没有包结构,如果是A.B.C 结构,那么顶层模块是 A。基本上遵循这样的原则:

  1. 如果是绝对导入,一个模块只能导入自身的子模块或和它的顶层模块同级别的模块及其子模块
  2. 如果是相对导入,一个模块必须有包结构且只能导入它的顶层模块内部的模块

如果一个模块被直接运行,则它自己为顶层模块,不存在层次结构,所以找不到其他的相对路径。

Python2.x 缺省为相对路径导入,Python3.x 缺省为绝对路径导入。绝对导入可以避免导入子包覆盖掉标准库模块(由于名字相同,发生冲突)。如果在 Python2.x 中要默认使用绝对导入,可以在文件开头加入如下语句:

 

那么到底什么是隐式相对导入,什么又是显示的相对导入呢?我们来看一个例子,假设有如下包结构:

 

那么如果在 stool 中引用 bench,则有如下几种方式:

 

隐式相对就是没有告诉解释器相对于谁,但默认相对与当前模块;而显示相对则明确告诉解释器相对于谁来导入。以上导入方式的第三种,才是官方推荐的,第一种是官方强烈不推荐的,Python3 中已经被废弃,这种方式只能用于导入 path 中的模块。

相对与绝对仅针对包内导入而言

最后再次强调,相对导入与绝对导入仅针对于包内导入而言,要不然本文所讨论的内容就没有意义。所谓的包,就是包含 __init__.py 文件的目录,该文件在包导入时会被首先执行,该文件可以为空,也可以在其中加入任意合法的 Python 代码。

相对导入可以避免硬编码,对于包的维护是友好的。绝对导入可以避免与标准库命名的冲突,实际上也不推荐自定义模块与标准库命令相同。

前面提到含有相对导入的模块不能被直接运行,实际上含有绝对导入的模块也不能被直接运行,会出现 ImportError:

 

这与绝对导入时是一样的原因。要运行包中包含绝对导入和相对导入的模块,可以用 python -m A.B.C 告诉解释器模块的层次结构。

有人可能会问:假如有两个模块 a.py 和 b.py 放在同一个目录下,为什么能在 b.py 中 import a 呢?

这是因为这两个文件所在的目录不是一个包,那么每一个 python 文件都是一个独立的、可以直接被其他模块导入的模块,就像你导入标准库一样,它们不存在相对导入和绝对导入的问题。相对导入与绝对导入仅用于包内部。

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用python能有一定的帮助,如果有疑问大家可以留言交流。

}

发布时间: 17:08:58 来源:亿速云 阅读:90 作者:iii 栏目:

本文小编为大家详细介绍“python中如何自定义封装带颜色的logging模块”,内容详细,步骤清晰,细节处理妥当,希望这篇“python中如何自定义封装带颜色的logging模块”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

自己在搭建python接口自动化框架 分享一些内容过程中想自己封装一个logger方法 根据logging进行二次封装 代码如下

避坑:不要用这种方式去调用日志等级方法 会出现日志打印定位路径错误 只能定位在log封装类当前方法下

读到这里,这篇“python中如何自定义封装带颜色的logging模块”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

}

点击上方蓝色字体关注公众号

后台回复wuenda获取鼻祖的最精简ML入门课, 回复2获取Python和Pandas等的全部课程笔记,回复数字4查看深度学习完整地由浅到深地学习笔记。

参与就送2018年7月北大何老师出版的《Python与神经网络实战》,文章入口:送书,送书,送书!...

Python功能众多,你已尝试使用了几个,现在该大干一场了。

在本项目中,你将学习如何使用Pygame,这个扩展让你能够使用Python编写功能齐备的全屏街机游戏。

Pygame易于使用,功能非常强大。它由多个组件组成,Pygame文档(参见Pygame官网http://pygame.org)做了详尽的介绍。

本项目将介绍一些主要的Pygame概念,但鉴于本项目的目标是让你起步,因此不会介绍诸如声音和视频处理等有趣的功能。建议你掌握基本知识后再去探索其他功能。你还可以参阅

那么,如何编写计算机游戏呢?游戏的基本设计过程与其它程序类似,但开发对象模型前,必须先设计游戏本身,如游戏包含的角色、所处的环境以及要实现的目标。

为避免打乱有关Pygame基本概念的介绍,这里创建的游戏比较简单。如果你愿意,完全可以创建更复杂的游戏。

这里将创建的游戏是从巨蟒剧团推出的著名短剧“Self-Defense Against Fresh Fruit”改编而来的。在这个短剧中,军士长John Cleese指挥士兵使用防守战术抵御入侵者使用新鲜水果(如石榴、糖水芒果、青梅和香蕉)发起的进攻。防守战术包括使用枪支、放老虎以及敌人头顶扔下重达16吨的铅锤。在这个游戏中,我们将反过来,让玩家控制一只香蕉。这只香蕉要躲开从天而降的16吨铅锤,尽力在防御战中活下来。我想将这个游戏命名为Squish比较合适。

阅读本项目时,如果你想尝试编写自己的游戏,去做就是了。如果你只是想修改这个游戏的外观,只需替换其中的图形(几幅GIF或PNG图像)和一些描述性文本即可。

这个项目的目标是围绕着游戏设计展开的。

这款游戏必须像设计的那样:

  • 16吨的铅锤从天而降;

  • 另外,与往常一样,代码必须是模块化的,且易于扩展。

  • 一个重要的需求是: 设计应包含一些游戏状态(如游戏简介、关卡和“游戏结束”状态);

  • 同时可轻松地添加新状态。

这个项目需要的工具只有一个,那就是Pygame,可从其官网(http://pygame.org)下载。要在UNIX中使用Pygame,可能还需要安装其他一些软件,安装Pygame的最简单方式是使用pip。
Pygame发布版包含多个模块,但在这个项目中大都用不到。

接下来几小节将描述需要用到的模块(只讨论需要用到的具体函数或类)。除了接下来将描述的函数外,将用到的各种对象(如Surface、Group和Sprite)还包含一些很有用的方法,我们会在实现部分用到时对其进行讨论。

模块pygame包含类Surface,它返回一个新的Surface对象。Surface对象其实就是一个指定尺寸的空图像,可用来绘画和传送。传送(调用Surface对象的方法blit)意味着在Surface之间传输内容。【传送的英文单词blit是从技术术语块传输(block transfer)的简写BLT衍生而来的。】

函数init是Pygame游戏的核心,必须在游戏进入主事件循环前调用。这个函数自动化其他所有模块(如font和image)。

想要捕获Pygame特有的错误,就需要使用error类。

模块pygame.locals包含你可能在自定义模块的作用域内使用的名称(变量),如事件类型、键、视频模式等名称。可导入这个模块的所有内容(from pygame.locals import*),但如果知道需要哪些名称,应该做更具体的导入,如 from pygame.locals import FULLSCREEN。

模块pygame.display包含处理内容显示的函数,这些内容可显示在普通窗口中,也可占据整个屏幕。在这个项目中,需要用到如下函数:

  • flip:更新显示。一般而言,分两步来修改屏幕。首先,对函数get_surface返回的Surface对象做必要的修改,然后调用pygame.display.flip来更新显示,反映出所做的修改。

  • update:只想更新屏幕的一部分时,使用这个函数而不是flip。调用这个函数时,可只提供一个参数,即RenderUpdates类的方法draw返回的矩形列表(这个方法将在接下来讨论模块pygame.sprite时介绍)。

  • set_mode:设置显示的尺寸和类型。显示模式有多种,但这里只是用全拼模式和默认模式“在窗口中显示”。

  • set_caption:设置Pygame程序的标题。函数set_caption主要用于游戏在窗口中运行(而不是以全屏模式运行)时,因为标题将用作窗口的标题。

模块pygame.font将包含类Font。字体对象可用于表示不同的字体,可用于将文本渲染为可在Pygame中作为普通图形使用的图像。

Sprite类是所有可见游戏对象(在这个项目中,是香蕉和重16吨的铅锤)的基类。要实现自定义的游戏对象,可从Sprite派生出子类,并重写构造函数以设置其属性image和rect(这些属性决定了Sprite的外观和位置),同时重写在Sprite可能需要更新时调用的方法update。

Group及其子类的实例用作Sprite对象的容器。一般而言,使用Group是个不错的注意。在简单的游戏(如本项目)中,只需创建一个名为sprites或allsprites之类的Group,并将所有Sprite都添加到其中。这样,当你调用Group对象的方法update时,将自动调用所有Sprite对象的方法update。另外,Group对象的方法clear用于清除它包含的所有Sprite对象(实际的清理工作是使用一个回调函数完成的),而方法draw可用于绘制所有的Sprite对象。

在这个项目中,将使用Group的子类RenderUpdates,其方法draw返回列表,其中包含所有受到影响的矩形。可将这个列表传递给pygame.display.update,以后只更新需要更新的部分。通过这样做,有可能极大地改善游戏的性能。

在即将开发的游戏Squish中,只是用模块pygame.mouse来做两件事情:隐藏鼠标以及获取鼠标的位置。这两件事分别:

模块pygame.event跟踪各种事件,如鼠标单击、鼠标移动、按下或松开键等。要获取最近发生的事件列表,可使用函数pygame.event.get。

模块pygame.image用于处理图像,如以GIF、PNG、JPEG和其他几种文件格式存储的图像。在这个项目中,只需要这个模块的函数load,它读取图像文件并创建一个包含该图像的Surface对象。

对一些Pygame模块的功能进行粗略了解后,该动手编写这个游戏的第一个原型了。必须确保安装了Pygame,包括模块image和font。(要核实是否安装了这些模块,可在交互式Python解释器中导入它们。)

还需准备几幅图像。如果要按本项目说的那样呈现游戏的主题,就需要两幅图像,分别表示重16吨的铅锤和香蕉。这些图像的尺寸无关紧要,但最好在100像素x100像素~200像素x200像素之间。这两幅图像还应使用常见的图像文件格式,如GIF、PNG或JPEG。

你可能还想提供一张启动屏幕(像游戏用户问候的第一个屏幕)图像。在这个项目中,我直接使用了表示铅锤的图像。

使用诸如Pygame等新工具开发程序时,应让第一个原型尽可能简单,并将重点放在学习新工具的基本知识,而不是程序本身的细节上。这样做通常大有裨益。因此,在游戏Squish的第一个版本中,我们只创建重16吨的铅锤从天而降的动画。制作这个动画需要步骤如下:

3) 使用这幅图像创建自定义类Weight(Sprite的子类)的一个实例。将这个对象添加到RenderUpdates编组sprites中。(处理多个Sprite对象时,这样做很有帮助。)

4) 使用pygame.event.get获取最近发生的所有事件,并依次检查这些事件。如果发现事件QUIT或因按下Escape键(K_ESCAPE)而触发的KEYDOWN事件,就退出程序。(事件类型和键分别存储在事件对象的属性type和key中。诸如QUIT、KEYDOWN和K_ESCAPE等常量可从模块pygame.locals导入。)

6) 调用sprites.draw并将屏幕表面作为参数,以便在当前位置绘制铅锤(每次调用Weight实例的update方法后,位置都将发生变化)。

下图列出了实现这些步骤的代码。在你退出游戏,如关闭窗口时,将发生QUIT事件。

要运行这个程序,可使用下面的命令:

执行这个命令时,必须确保weights.py和weight.png(铅锤图像)都在当前目录中。下图显示了执行这个程序时部分场景:

听设计游戏的说,他最多可以玩到第5关,游戏高手快去试试吧.......

这些代码大都是不言自明的,但有几点需要解释一下。

所有的Sprite对象都有属性image和rect,其中前者应是一个Surface对象(图像)而后者应是一个矩形对象(只需使用self.image.get_rect()初始化它即可)。绘制Sprite对象时,将用到这两个属性。通过修改self.rect,可移动Sprite对象。

Surface对象包含方法convert,可用于创建使用不同颜色模式的副本。你无需关心细节,只需在调用convert时不提供任何参数即可。这将根据当前显示量身定制一个Surface对象,从而最大限度的提高其显示速度。

颜色是使用RGB元组(红-绿-蓝,每个值的取值范围都是0~255)指定的,因此元组(255, 255, 255)表示白色。

Pygame技术就位后,该稍微扩展和重构游戏的逻辑了,想要获取源码,或文章有不懂的加一下小陈的QQ群(,备注:小陈学Python).

}

我要回帖

更多关于 象棋桥中如何自定义 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信