Python面向对象之模块和包
模块
模块的概念
模块是Python程序架构的一个核心概念
- 所有以.py结尾的源文件都是一个模块;
- 模块名也是标识符,需要遵循标识符的命名规则;
- 在模块中定义的全局变量,类,函数,都是直接给外界使用的工具;
- 模块就好比一个工具包,而里面的函数和变量就是工具,要想使用模块,先导入;
模块的两种导入方式
方式1:import 导入
导入方式如下:
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
# 后面的代码只需要将模块名替换一下即可
方式2:from... import xx
- 如果希望从某一模块中,导入部分工具,就可以使用 from ... import的方式;
- import 模块名 是一次性将模块中的所有工具导入,并且通过 模块名/别名 访问;
导入部分工具语法如下:
# 从 某模块 导入 某工具
from 模块名1 import 工具名
导入之后,不再需要通过 模块名. 使用工具,可以直接使用模块提供的工具--类,函数,全局变量;
from ... import *(了解)
# 从模块 导入所有工具
from 模块名1 import *
这种方式不推荐使用,因为函数重名时并没有任何提示,出现问题不好排查。
导入同名函数
注意:如果两个模块,存在同名的函数,后导入的函数,会覆盖先导入的函数;
和这个类似的是类的继承,但顺序不同,优先使用先继承的类中的方法;
- 开发时import代码应该统一写在代码顶部,更容易及时发现冲突;
- 一旦发现冲突,可以使用as关键字给其中一个同名工具起别名;
模块搜索顺序
python解释器在导入模块时,会:
- 搜索当前目录指定模块名的文件,如果有则直接导入;
- 如果没有,再搜索系统目录;
在开发时,给文件起名,不要和系统的模块文件重名;
可以使用模块的内置属性 模块名.file 可以查看模块的文件路径;
如果当前目录下存在一个和系统的模块文件重名的文件,会优先调用当前目录文件,从而引起错误;
开发原则及导入模块问题
开发原则
开发原则--每一个文件都应该是可以被导入的。
- 一个独立的python文件就是一个模块;
- 在导入模块时,模块文件中所有没有任何缩进的代码都会被执行一遍;
实际开发场景
在实际开发中,每一个模块都是独立开发的,大多都有专人负责;
开发人员通常在模块下方增加一些测试代码; 仅在模块内使用,而被导入到其他文件不需要执行;
导入模块存在问题
当我们导入一个文件时,文件中所有未缩进的代码都会被执行一遍,比如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__属性解决测试和调用问题
__name__属性,可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行;
__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 文件;
- 包名的命名方式和变量名一致,字母数字下划线,但不能以数字开头;
- 作用:使用 import 包名 可以一次性导入包中的所有模块;
init.py
要在外界使用包中的模块,需要在 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*
pip安装第三方模块
- 第三方模块通常是指 由知名的第三方团队开发的 并且被python程序员广泛使用的包/模块;
- pip是一个现代的,通用的python包管理工具;
- 提供了对python包的查找,下载,安装,卸载等功能;
安装和卸载命令如下:
sudo pip install pygame
sudo pip uninstall pygame
pip安装卸载演示
# 将模块安装到python3.x环境下
sudo pip3 install pygame
sudo pip3 uninstall pygame
Python面向对象之模块和包的更多相关文章
- 二十五. Python基础(25)--模块和包
二十五. Python基础(25)--模块和包 ● 知识框架 ● 模块的属性__name__ # my_module.py def fun1(): print("Hello& ...
- Python中的模块与包
标准库的安装路径 在import模块的时候,python是通过系统路径找到这些模块的,我们可以将这些路径打印出来: >>> pprint.pprint(sys.path) ['', ...
- 【循序渐进学Python】10.模块和包
1.导入模块 任何Python程序都可以作为模块导入,只要Python解释器能找到我们定义的模块所在位置即可,一般来讲,在一个模块被导入时,Python解释器会按照下面的步骤进行搜索: 在当前所在目录 ...
- Python类、模块、包的区别
类 类的概念在许多语言中出现,很容易理解.它将数据和操作进行封装,以便将来的复用. 模块 模块,在Python可理解为对应于一个文件.在创建了一个脚本文件后,定义了某些函数和变量.你在其他需要这些功能 ...
- Python进阶之模块与包
模块 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","S ...
- python之路模块与包
一.import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译为共享库或DLL的C或C++扩展 3 包好一组模块的包 4 使用C编写并链接到 ...
- 【Python实战】模块和包导入详解(import)
1.模块(module) 1.1 模块定义 通常模块为一个.py文件,其他可作为module的文件类型还有".pyo".".pyc".".pyd&qu ...
- python中的模块和包
模块 一 什么是模块 模块就是一组功能的集合体,可以通过导入模块来复用模块的功能. 比如我在同一个文件夹定义两个.py文件,分别命名为A.py和B.py,那么可以通过在A文件里通过import B来使 ...
- python之路--模块和包
一 . 模块 ⾸先,我们先看⼀个老⽣常谈的问题. 什么是模块. 模块就是⼀个包含了python定义和声明的⽂件, ⽂件名就是模块的名字加上.py后缀. 换句话说我们⽬前写的所有的py⽂件都可以看成是⼀ ...
随机推荐
- Rsync 实现远程同步
介绍 rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件.rsync使用所谓的“rsync算法”来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部 ...
- Spring + MyBaits java.lang.reflect.InvocationTargetException 启动日志报错
调试发现 实例化 class org.apache.ibatis.logging.slf4j.Slf4jImpl时发生异常,所以 slf4j jar 问题解决: http://www.cnblogs. ...
- docker监控之cadvisor
docker run -d \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:rw \ --volume=/sys:/sys:ro \ --vo ...
- Qt之对话框QDialog
这一节主要讲述对话框类,先讲述两种不同类型的对话框,再介绍Qt提供的几个标准对话框.对应本节的内容,可以在帮助索引中查看 QDialog 和 Dialog Windows 关键字. 一.模态和非模态对 ...
- SPRING-BOOT系列之SpringBoot的诞生及其和微服务的关系
转载自 : https://www.cnblogs.com/ityouknow/p/9034377.html 微服务架构 微服务的诞生并非偶然,它是在互联网高速发展,技术日新月异的变化以及传统架构无法 ...
- 今天发现一个汉字转换成拼音的模块,记录一下,直接pip install xpinyin即可
http://blog.csdn.net/qq_33232071/article/details/50915760
- 通过表单展示不一样的页面(input对象)
表单中包含不一样的样式,不同功能的提交数据的方式.在许多页面中,浏览者不经意间已经不断在使用表单的功能,如留言,设置自己的密码或者是复选框,下拉列表等. input对象下的多种表单表现形式: 通常在页 ...
- Unity Mesh 初体验
什么是Mesh Mesh是Unity中的一个组件,称为网格组件.通俗的讲,Mesh是指模型的网格,3D模型是由多边形拼接而成,而一个复杂的多边形,实际上是由多个三角面拼接而成.所以一个3D模型的表面是 ...
- Dapper系列之三:Dapper的事务修改与删除
Dapepr的Update和Delete Dapper入门Dapper查询 上两篇文章我们介绍Dapper中添加和查询.本篇文章我们继续讲解修改和删除....如果本篇文章看不懂,请看阅读上两篇Dapp ...
- BZOJ1132: [POI2008]Tro(叉积 排序)
题意 世上最良心题目描述qwq 平面上有N个点. 求出所有以这N个点为顶点的三角形的面积和 N<=3000 Sol 直接模拟是$n^3$的. 考虑先枚举一个$i$,那么我们要算的就是$\sum_ ...