模块是Python程序架构的一个核心概念
导入方式如下:
import 模块名1,模块名2
但在pep8中建议,每次导入的模块应该独占一行; 即:
import 模块名1
import 模块名2
导入之后。通过 模块名. 调用模块中的全局变量,函数,类;
使用as指定模块的别名 如果模块的名字太长,可以使用as指定模块的名称,以便在代码中的使用;语法如下:
import 模块名1 as 模块别名
注意,模块别名应该符合大驼峰命名法;
示例:
import game_show_help as help
import game_start_play as play
# 后面的代码只需要将模块名替换一下即可
导入部分工具语法如下:
# 从 某模块 导入 某工具
from 模块名1 import 工具名
导入之后,不再需要通过 模块名. 使用工具,可以直接使用模块提供的工具--类,函数,全局变量;
from ... import *(了解)
# 从模块 导入所有工具
from 模块名1 import *
这种方式不推荐使用,因为函数重名时并没有任何提示,出现问题不好排查。
注意:如果两个模块,存在同名的函数,后导入的函数,会覆盖先导入的函数; 和这个类似的是类的继承,但顺序不同,优先使用先继承的类中的方法;
python解释器在导入模块时,会:
在开发时,给文件起名,不要和系统的模块文件重名; 可以使用模块的内置属性 **模块名.__file__ 可以查看模块的文件路径**;
如果当前目录下存在一个和系统的模块文件重名的文件,会优先调用当前目录文件,从而引起错误;
开发原则--每一个文件都应该是可以被导入的。
实际开发场景
在实际开发中,每一个模块都是独立开发的,大多都有专人负责; 开发人员通常在模块下方增加一些测试代码; 仅在模块内使用,而被导入到其他文件不需要执行;
当我们导入一个文件时,文件中所有未缩进的代码都会被执行一遍,比如print或者调用函数等,而这并不是我们希望看到的;
例如,以下是两个文件:
cp_06test1.py
def say_hello():
print("hello python")
print("test1")
say_hello()
cp_07use_test.py
import cp_06test1
print("-"*50)
# test1
# hello python
# --------------------------------------------------
我们可以看到,在第二个文件中,只导入并且随意输出一个字符;在导入时首先会将第一个文件的代码执行一遍,再执行第二个文件中的内容。
__name__是python中的一个内置属性,记录着一个字符串;
如果是被其他文件导入的,__name__就是模块名;
如果是当前执行的程序,__name__就是__main__;
我们可以根据这个特性来给测试代码添加缩进,这样,在本地代码就可以只在本地执行被执行,而在被导入时不会被执行;
使用__name__解决示例如下:
cp_06test1.py
def say_hello():
print("hello python")
# 判断是否是在本函数执行,如果是在本函数执行,就执行以下代码
# 如果是被其他文件的函数调用,则略过下列代码
if __name__ == "__main__":
print(__name__) # __main__
print("test1")
say_hello()
cp_07use_test.py
import cp_06test1
# 未使用__name__前,在调用test1时,输出的__name__为 cp_06test1
print("-"*50)
cp_06test1.say_hello()
# --------------------------------------------------
# hello python
要在外界使用包中的模块,需要在 init.py 中指定对外界提供的模块列表; __init__中的内容可能如下:
from . import 模块名1
from . import 模块名2
通用:
先新建一个文件,命名应该符合包;
然后在文件下建立__init__.py文件,就是包了;
pycharm下:
右键,python packge,输入包名,IDE自动创建包。
message包下有:init.py;send_message.py;receive_message.py。
send_message.py内容
def send(mess):
print("发送消息 %s" % mess)
receive_message.py内容
def receive():
print("收到消息")
init.py内容
from . import send_message
from . import receive_message
包外文件: use_packge.py内容
import message
message.send_message.send("xiaoxi")
message.receive_message.receive()
# 发送消息 xiaoxi
# 收到消息
linux下
1.创建 setup.py 在准备好的模块文件的统计目录,创建setup.py文件; setup.py和要发布的模块文件同级目录,不是下级;
setup.py内容:
from distutils.core import setup
setup(
name='xxx', # 包名
version='1.0.0', # 版本
author='xxx', # 作者
author_email='xxx@163.com', # 作者邮箱
url='xxx.com', # 网址/主页
description='这是我的第一个发布安装文件' # 描述信息
py_moudles=["包名.模块名1", "包名.模块名2"]
)
2.构建模块
python3 setup.py build
3.生成发布压缩包
python3 setup.py sdist
可以将制作好的模块压缩包直接发送给别人,按照后面学习的 安装包 内容解压缩安装即可; 但如果需要将包上传到网上供别人的话,可以自行百度(也可以上传到github上)。
tar -zxvf message-1.0.tar.gz
sudo python setup.py install
可以使用 message.__file__ 查看完整文件目录,以便删除;
卸载模块 直接从安装目录下,把安装模块的目录删除就可以了;
cd usr/local/lib/python3.5/dist-packages/
sudo rm -r message*
安装和卸载命令如下:
sudo pip install pygame
sudo pip uninstall pygame
pip安装卸载演示
# 将模块安装到python3.x环境下
sudo pip3 install pygame
sudo pip3 uninstall pygame