热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

对于python来说、一个模块就是一个文件PYTHON中的包和模块

为了更加友好的对python代码进行组织管理,python中出现了包和模块的概念类似生活中整理我们的物品一样,将代码按照不同的功能进行整理整合

为了更加友好的对python代码进行组织管理,python中出现了包和模块的概念

类似生活中整理我们的物品一样,将代码按照不同的功能进行整理整合,可以很大程度的提升代码可读性和代码质量,方便在项目中进行协同开发!AAffA0nNPuCLAAAAAElFTkSuQmCC

这一部分,主要从以下几个部分进行说明:

(1)     包和模块的定义

(2)     包和模块的复用

a)   import引入和from..import引入

b)   绝对引入和相对引入

(3)     自定义模块和包

(4)     包的发布管理

(5)     python中的“main函数”

1.1. 包和模块的定义

python中的包和模块,首先是按照代码的功能进行整理整合,想相似功能的代码/大量代码整理到一起方便统一管理

模块(module):python中每个python文件就是一个模块,每个python文件中,封装类似功能的变量、函数、类型等等,可以被其他的python模块通过import关键字引入重复使用!

包(pakcage):包含多个python文件/模块的文件夹,并且文件夹中有一个名称为__init__.py的特殊声明文件,那么这个文件夹就是一个包(模块包),可以将大量功能相关的python模块包含起来统一管理,同样也可以被其他模块通过import关键字引入重复使用封装的模块和代码!

AAffA0nNPuCLAAAAAElFTkSuQmCCAAffA0nNPuCLAAAAAElFTkSuQmCC

具备一定功能的工具包含很多工具、功能强大的工具箱

python中的模块python中的包(模块包/程序包)

1.1.1  模块的定义

在工作目录workspace/文件夹中创建自定义测试文件夹demo01/

在demo01/中创建文件utils.py,这就是一个工具模块[见名知意]demo01/utils.py

------

"’’工具模块,主要定义项目中可能使用到的各种工具变量、常量、函数、类型等等’’’

1.1.2. 包的定义

在demo01/文件夹中,创建一个文件夹modules/

在modules/文件夹中,创建一个空文件__init__.py

此时,modules就是程序包,可以在该文件夹中定义各种模块,如User.py..demo01/

modules/

__init__.py

User.py    #属于modules包的一个模块

1.2. 包和模块的复用

python中,将代码封装成包和模块,最主要的目的是通过有效的整理代码,提高代码的复用性能,这里整理好封装起来的包和模块的代码,就可以被其他代码引入使用了,类似生活中的工具被其他人借用一样AAffA0nNPuCLAAAAAElFTkSuQmCCAAffA0nNPuCLAAAAAElFTkSuQmCC

自行开发的游戏代码中,本身没有对键盘鼠标、显示器的控制代码,但是通过引入了pygame模块,让自己的代码中具备了这样的功能,pygame代码被复用了生活中的三口之家,家里买车~但是可以通过租车实现自驾游!具备了有车的功能

物品车被复用了

1.2.1.   import 和 from .. import

包和模块的引入,通常有两个关键语法

l  import 包/模块

l  from 包/模块 import 具体对象

(1)     import方式

基本语法# 引入方式

import 模块

# 使用模块中的数据

模块.变量

模块.函数

模块.类型

REMARK:import方式可以引入包、模块;

import引入的包和模块会自动从当前文件夹中、系统环境变量PYTHONPATH中、以及系统的sys.path路径中查询是否存在该名称的包/模块

如果不存在,就会出现错误:no module named "xxxxxx’

案例操作代码:

(2)     from xx import方式

from xx import方式基本语法如下from . import xxx # 从当前模块路径下,引入xxx模块

from .. import xxx # 从当前模块的父级路径下,引入xxx模块

from pkg import module  # 从 pkg包中引入一个模块module

from pkg.module import vars, func, clazz#   从指定的模块中直接引入

REMARK:from xx import语法方式,主要是针对出现了包结构的python代码而特定的代码引入方式,首先要非常明确代码的组织结构才能正确使用from   import语法进行代码的引入和复用

REMARK2:通过上述代码,可以看到form import语法区分为两种操作

使用了./..的相对路径的引入操作方式

直接使用包/模块名称的绝对引入操作方式

1.2.2.   from import 相对引入

首先,相对引入本身是相对当前正在操作的文件的路径

同一级路径使用符号:.

上一级路径使用符号:..

创建测试项目文件夹demo02/

项目中创建一个工具模块:utils.py#   coding:utf-8

#测试变量

test_msg   = “hello”

#测试函数

def   test_func():

print(“test函数操作”)

#测试类型

class   Test:

pass

项目中创建主测试模块:main.py#模块的相对引入

from   . import utils

#测试变量

print(utils.test_msg)

#测试函数

utils.test_func()

#测试类型

t =   utils.Test()

包的引入可以通过相对路径直接操作,这里的demo02/可以是python的包,也可以是一个普通包含python代码的文件夹。

但是需要注意的是,一旦使用相对路径,就要明确所谓相对路径~是依赖他们所属的父级文件夹确定的,就类似生活中的兄弟姐妹的称谓一样,是相对他们的父亲来说的,所以运行代码需要在demo02/文件夹所在路径,执行如下命令运行#命令行执行运行代码的命令,告诉python解释器在执行指定路径中的python代码

python   –m demo02.main

REMARK:如果直接在demo02/文件夹中,执行命令

python   main.py就会出现如下错误

ImportError:cannot   import name "utils’

AAffA0nNPuCLAAAAAElFTkSuQmCCAAffA0nNPuCLAAAAAElFTkSuQmCCAAffA0nNPuCLAAAAAElFTkSuQmCC

REMARK:包和模块的相对引入,一定要切记:引入的路径相对当前文件;执行的路径相对于引入的最外层文件夹,这样才能正确的使用相对引入操作执行我们的模块代码!

1.2.3.   from import 绝对引入

绝对引入操作方式比较直接,从最外层的包的源头直接开始操作;

如:from pygame import K_A, K_S, K_D, K_W

这种操作方式在第三方模块的操作中是司空见惯的,但是在独立的项目开发中使用较少!

还是上面那个案例操作,修改main.py代码如下:#相对引入操作

#   from . import utils

#绝对引入操作

from   demo02 import utils

#使用utils中的变量、函数、类型等等..

运行操作方式当然和前面讲过的类似,既然你确定了项目是从demo02/为最外层文件夹的话,那么运行也是参考demo02来执行命令python –m demo02.main

1.3. 再说模块和包

前面的所有操作,都是在已有代码的基础上,对存在的文件进行处理,为了更友好的管理代码,我们对模块和包的操作方式进行详细的描述和说明

1.3.1.   模块(module)

python中的模块,指代的就是一个Python文件

(1)     在一个python模块中可以包含的数据有:变量、函数、类型等等,是一个完整的独立的代码块!

(2)     独立的一个模块中的变量:全局变量、局部变量;能被其他模块引入使用的只有当前模块中的全局变量,其他模块对于当前模块中全局变量的操作和普通变量一致!

(3)     模块一旦被其他模块引入,就会自动执行模块中的所有代码

(4)     模块中的测试代码可以包含在 if __name__ == “__main__”: 语句块中,这样不会再其他模块引入时执行这些测试代码

一个标准模块的定义方式【模块名称:见名知意】# coding:utf-8

#引入系统标准模块

#引入第三方模块

#引入自定义开发模块

#声明定义变量

#声明定义函数

#声明定义类型

#当前模块测试代码

if __name__ == “__main__”:

#测试代码位置,其他模块引入不会执行这里的代码

1.3.2.   包(package)

python解释器在执行处理代码时,会默认将包含Python文件的文件夹处理成默认包

默认包只具备文件路径关联的功能,无其他功能!

python中的标准包,是在文件夹中包含包声明文件__init__.py的文件夹,主要包含了一个名称为__init__.py的模块文件,该文件夹就是一个Python模块包

在一个python的包中,可以创建多个模块,统一由python包进行路径管理和导入方式的管理,如定义了一个python的数据模型包如下:demo03/

users/

__init__.py     #包声明模块

moduels.py      #数据类型定义模块-> User

manager.py      #数据模型管理模块->UserManager

menus.py        #界面处理模块->show_index

main.py      #程序主模块

demo03/users/menus.py中代码如下#   coding:utf-8

def   show_index():

print(“系统主菜单”)

demo03/main.py中代码如下:#   coding:utf-8

#引入包中指定的模块

from   users import menus

#使用模块中的代码

menus.show_index()

REMARK:定义了包之后,包中的变量、函数、类型的引入方式相似

1.3.3.   包:__all__

默认情况下,包中所有的模块都是可以直接导入的,同样为了使用方便,可以通过通配符的方式来一次引入包中所有指定的模块

__all__属性就是用于模糊导入的特殊魔法属性,值是一个包含模块名称的列表,主要声明在__init__.py文件中,用于定义可以使用通配符的方式引入的模块demo03/users/__init__.py

-------

__all__   = ["module’, "manager’, "menus’]

此时可以在main.py中通过通配符的方式将__all__中包含的模块一次性导入from   users import *

相当于

from   users imoprt module, manager, menus

1.4. 再说导入

从前面的内容可以看出,代码的导入方式主要有两种语法结构,这一小节对于两种导入结构的操作方式做一个简短的小结

1.4.1.   import导入

基本语法结构如下:#导入一个包/模块

import包名称/模块名称

#导入一个包中的某个模块

import包名称.模块名称

#导入一个包中的某个模块中的某个函数

imoprt包名称.模块名称.函数名称

#导入一个包中的某个模块中的某个类型[名称较长,使用别名]

imoprt包名称.模块名称.类型名称  as别名

1.4.2.   from import导入

基本语法结构如下#导入一个包中的所有模块[__all__定义的模块]

from包名称 imoprt *

#导入一个包中指定的模块

from包名称 imoprt模块名称

#导入一个包中指定模块中的某个函数

from包名称.模块名称 import函数名称

#导入一个包中指定模块中的某个类型[名称较长,使用别名]

from包名称.模块名称 imoprt类型名称 as别名

1.5. 自定义包的发布

如果已经开发好了具备某些通用功能的模块包,恰好作者也是一个特别具有分享精神的开发人员,要将自己开发的python模块发布出来,提供给其他人进行操作使用,类似于我们使用pygame这样第三方模块一样,别人也可以通过命令直接安装使用,应该怎么操作?

这一部分就是关于包的发布操作进行的详细说明

1.5.1.   本地发布

在我们已经开发好的一个包文件夹下,创建一个python模块:setup.py

模块中定义如下内容#引入构建包信息的模块

from distutils.core   import setup

#定义发布的包文件的信息

setup(

name=“damu_pkg01”,  #发布的包文件名称

version=”1.0”,   #发布的包的版本序号

description=”我的测试包”, #发布包的描述信息

author=”大牧莫邪”,   #发布包的作者信息

author_email=”damu@163.com”,   #作者联系邮箱信息

py_modules=["__init__.py’,’..’,..]#发布的包中的模块文件列表

)

执行当前程序包文件的构建操作命令:按照标准格式组织包中的所有数据文件python setup.py build

REMARK:构建完毕的文件

可以通过python setup.py install命令直接当成第三方模块进行安装

执行命令进行包的打包发布python setup.py sdist

REMARK:打包的文件,主要是方便进行网络传输,打包之后会在dist中创建包含包中所有信息的tar.gz压缩包文件;该文件就可以通过git等方式提交给对应的开源组织发布你的自定义模块了!

1.5.2.   网络发布

经历了前面一小节的操作之后,我们能不能让我们自己的包也类似于pip install这样的方式通过网络进行安装呢? 当然可以!当然前提条件是我们将自己的包发布到网络上!

这个网站是目前大部分python第三方模块集中的一个管理社区平台AAffA0nNPuCLAAAAAElFTkSuQmCC

其次:你已经准备好你自己的python程序包,并在包中准备好了setup.py文件

在setup.py中,已经定义好了程序包的所有描述信息damy_users/

__init__.py

moduels.py

manager.py

menus.py

setup.py

执行打包命令python setup.py sdist

接下来:将是激动人心的时刻!

首先安装第三方模块:twine,用于上传我们打包的项目文件pip install twine

上传项目twine upload dist/*

AAffA0nNPuCLAAAAAElFTkSuQmCC

此时,如果我们还需要我们自己开发的某个模块的话,直接通过pip命令安装即可pip install damu_users

AAffA0nNPuCLAAAAAElFTkSuQmCC

1.6. 关于Main主方法

类比其他编程语言,为了区别同一个应用程序中运行程序的入口,都会提供一个程序运行的主方法(类似Java中的main方法)或者主函数(类似C/C++中的主函数)

PYTHON最小运行单元是代码块,代码块中甚至只是包含一行代码也能正常运行,所以没有主方法或者函数的概念,但是区别程序运行的入口是非常有必要的,比如我们在自定义开发一个模块时,为了保证模块代码的正确性,很多人都会在模块中编写一些测试代码(规范不是很推荐这样做,但是不否认这是大多数人的懒癌操作方式),这些代码只有当前模块作为程序入口时才允许运行,被其他模块引入时要求不让运行,怎么做到这样一点呢?PYTHON中的模块属性__name__可以做到模拟主函数的操作

下面通过两种常规操作说明模拟主函数的意义

1.6.1.   普通模块的定义和问题

在开发过程中,我们常规模块的定义开发,经常定义如下格式的代码(demo.py):"’’某个模块的注释’’’

# import各种依赖模块

#定义模块中的变量

count = 0

msg = None

#定义模块中的函数

def show_info(info):

print(“info   for send: {}”.format(info))

#测试代码

show_info(“my name is   damu”)

定义好模块之后,通过执行命令python demo.py,就可以测试模块中的代码的正确性

使用场景:如果我们自己开发了另一个模块,需要依赖当前开发的这个模块

就需要通过import demo的方式在另一个模块中引入,那么问题在哪里呢?

问题显现:模块一旦被其他模块引入,模块中的代码都会直接执行,那么这里demo模块被其他模块引入时,正常功能代码都会加载,但是用于测试的代码也被运行了,这可能会引起不必要的错误和系统资源的浪费,并不是我们想要的

1.6.2.   PYTHON中的main方法

PYTHON中的模块有一个魔法属性__name__,表示当前模块的运行时名称,具有如下特点:

l  当前模块如果是程序运行入口,__name__的值:__main__

l  当前模块如果被其他模块import引入,__name__的值:模块名称

模块的魔法属性__name__

定义模块demo.py, main.py,用于测试魔法属性的操作demo.py

print(__name__)

print(“my   name is demo”)

main.py

import   demo

print(“my   name is main”)

执行测试运行如下:

首先直接运行demo: python demo.py,得到结果如下:

__main__

my   name is demo

直接运行main:python main.py

demo

my   name is demo

my   name is main

很明显可以看到运行的过程中,作为入口和被import的区别,我们可以利用__name__的特性完成main方法的设计重新定义demo.py

-------------

# coding:utf-8

# import 各种依赖

# 定义模块变量

count = 0

msg = None

# 定义模块函数

def show_info(info):

print(“info   for send: {}”.format(info))

# 测试代码:包含在模拟的main方法中,解决被import带来的执行问题

if __name__ == “__main__”:

# 执行测试的代码:该代码只有当前模块在运行时才会执行,其他模块import操作并不会执行,避免了由于测试代码导致错误发生的可能

show_info(“hello   my name is main”)


推荐阅读
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 本文将详细介绍如何在Mac上安装Jupyter Notebook,并提供一些常见的问题解决方法。通过这些步骤,您将能够顺利地在Mac上运行Jupyter Notebook。 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 掌握PHP编程必备知识与技巧——全面教程在当今的PHP开发中,了解并运用最新的技术和最佳实践至关重要。本教程将详细介绍PHP编程的核心知识与实用技巧。首先,确保你正在使用PHP 5.3或更高版本,最好是最新版本,以充分利用其性能优化和新特性。此外,我们还将探讨代码结构、安全性和性能优化等方面的内容,帮助你成为一名更高效的PHP开发者。 ... [详细]
  • 在Windows环境下离线安装PyTorch GPU版时,首先需确认系统配置,例如本文作者使用的是Win8、CUDA 8.0和Python 3.6.5。用户应根据自身Python和CUDA版本,在PyTorch官网查找并下载相应的.whl文件。此外,建议检查系统环境变量设置,确保CUDA路径正确配置,以避免安装过程中可能出现的兼容性问题。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
author-avatar
mobiledu2502882465
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有