PYTHON核心开发

使用python中的模块

1.使用系统内建标准模块

系统内建标准模块,安装好python解释器环境之后,可以直接导入使用的

# 加密模块
import hashlib

2.安装一个第三方模块

第三方模块,非官方组织开发的,在网络上发布的模块,提供给其他开发人员使用

# 安装第三方模块pygame
pip install pygame

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

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

模块(modules) & 包(package)

1.1 概念

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

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

1.2 模块和包的定义

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

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

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

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

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

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

demo01/
    modules/
        __init__.py
        user.py    # 属于modules包的一个模块

 包和普通文件夹的区别:
python中的包,就是一个包含了__init__.py文件的特殊文件夹。
python中的包可以有效的管理和组织python中的模块。
普通文件夹,也是一种最简单的(人工约定)包!没有通过__init__.py声明的包那么强大。

1.3 模块和包的复用

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

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

1.4 import 和 from .. import

包和模块的引入,通常有两个关键语法
import 包/模块
from 包/模块 import 具体对象

pycharm:开发工具:写好的所有代码~都被当成一个代码块执行!
     独立的代码块:当前文件夹 -> 源码文件夹[Source Root]
交互模式:交互命令行:每行代码,都会被当成一个独立的代码块执行!
     系统认为当前文件夹~也是可以查询搜索python代码的模块和包!
python代码的执行:按照代码块一次执行;一个代码块执行一次

(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# 从指定的模块中直接引入
REMARK1:from xx import 语法方式,主要是针对出现了包结构的python代码而特定的代码引入方式,首先要非常明确代码的组织结构才能正确使用from import语法进行代码的引入和复用
REMARK2:通过上述代码,可以看到form import语法区分为两种操作
(1)使用了./..的相对路径的引入操作方式;(2)直接使用包/模块名称的绝对引入操作方式

1.5 from import 相对引入与绝对引入

1.5.1 相对引入本身是相对当前正在操作的文件的路径
同一级路径使用符号:.
上一级路径使用符号:..

创建测试项目文件夹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’

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

1.5.2 绝对引入操作方式比较直接,从最外层的包的源头直接开始操作;
如: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.6 再说模块与包

模块(module)
python中的模块,指代的就是一个Python文件;模块名称就是文件名称
(1)在一个python模块中可以包含的数据有:变量、函数、类型等等,是一个完整的独立的代码块!
(2)独立的一个模块中的变量:全局变量、局部变量;能被其他模块引入使用的只有当前模块中的全局变量,其他模块对于当前模块中全局变量的操作和普通变量一致!
(3)模块一旦被其他模块引入,就会自动执行模块中的所有代码
(4)模块中的测试代码可以包含在 if __name__ == “__main__”: 语句块中,这样不会再其他模块引入时执行这些测试代码

一个标准模块的定义方式【模块名称:见名知意】

# coding:utf-8

# 引入系统标准模块
# 引入第三方模块
# 引入自定义开发模块

# 声明定义变量
# 声明定义函数
# 声明定义类型

# 当前模块测试代码
if __name__ == “__main__”:
    #测试代码位置,其他模块引入不会执行这里的代码

包(package)
python解释器在执行处理代码时,会默认将包含Python文件的文件夹处理成默认包
默认包只具备文件路径关联的功能,无其他功能!
python中的标准包,是在文件夹中包含包声明文件__init__.py的文件夹,主要包含了一个名称为__init__.py的模块文件,该文件夹就是一个Python模块包
在一个python的包中,可以创建多个模块,统一由python包进行路径管理和导入方式的管理,如定义了一个python的数据模型包如下:

demo03/
    users/
        __init__.py     # 包声明模块
        moduels.py      # 数据类型定义模块-> User<class>
        manager.py      # 数据模型管理模块->UserManager<class>
        menus.py        # 界面处理模块->show_index<function>
    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:定义了包之后,包中的变量、函数、类型的引入方式相似

包:__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.7 再说导入

1.7.1 import导入
基本语法结构如下:

# 导入一个包/模块
import 包名称/模块名称
# 导入一个包中的某个模块
import 包名称.模块名称
# 导入一个包中的某个模块中的某个函数
imoprt 包名称.模块名称.函数名称
# 导入一个包中的某个模块中的某个类型[名称较长,使用别名]
imoprt 包名称.模块名称.类型名称  as  别名

1.7.2 from import导入
基本语法结构如下


# 导入一个包中的所有模块[__all__定义的模块]
from 包名称 imoprt *
# 导入一个包中指定的模块
from 包名称 imoprt 模块名称
# 导入一个包中指定模块中的某个函数
from 包名称.模块名称 import 函数名称
# 导入一个包中指定模块中的某个类型[名称较长,使用别名]
from 包名称.模块名称 imoprt 类型名称 as 别名

1.8自定义包的发布

1.8.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.8.2 网络发布

进入http://pypi.python.org/pypi网站,注册一个自己的账号

将已经准备好你自己的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/*
然后通过pip命令安装:
pip install daqianshijie_users

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值