一、模块

  1.1 什么是模块

# 什么是模块
# 一组功能的集合,就是模块,在python中一个py文件就一个模块

  1.2 为什么要使用模块

# 1、可使代码的结构功能分区更清晰
# 2、可重复使用模块的功能,减少代码冗余
# 3、可以像内置模块一样,重复使用,提高开发的效率

  1. 3 如何使用

#在同目录中有三个文件
# simple_mod.py
# test1.py
# test2.py # test1.py 和 test2.py 分别以两种方式导入 simple_mod.py 
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Jmz str1 = 'jmz'
str2 = 'block dog'
l = [1,'xx','yy','ufo',('shanghai','hefei')] def get(index):
'''
获取第几个元素
:param index:
:return:
'''
global l
if index < len(l):
return l[int(index)-1] def add(data):
global l
l.append(data) def find():
print('''simple_mod:
str1:%s
str2:%s'''%(str1,str2))

simple_mod.py

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Jmz import simple_mod
# 导入simple_mod 模块,就是相当于 引入了 simple_mod 代码
# 用法,在使用simple_mod 的变量或函数时名,需要在变量名或函数名加上 导入的模块名(例如本次的导入的模块名simple_mod) simple_mod.str1 = 'test1' #重新赋值 simple_mod 中 str1 变量 print(simple_mod.str2)
# block dog simple_mod.find() # 调用simple_mod 中的find函数
# simple_mod:
# str1:test1
# str2:block dog

test1.py

#! /usr/bin/env python
# -*- coding:utf-8 -*-
# Author Jmz from simple_mod import *
# 导入 simple_mod 中的所有的代码
# 在当前模块空间 创建simple_mod 的变量名函数名(+引入地址) print(str1)
# jmz str1 = 'aaa' # 当前模块 创建了一个变量名,以及内存地址
str2 = 'bbb' find() # 当前模块没有 定义函数 则调用simple_mod的函数,函数内的变量(或函数)皆使用simple_mod模块的变量(或函数)
# simple_mod:
# str1:jmz
# str2:block dog

test2.py

  1.4 图解模块

  import simple_mod

  from simple_mod import *

二、模块的导入

  2.1 绝对路径导入

    2.1.1 下级目录模块导入

# 在同级目录下有这些文件和文件夹
# ├──dir
# │ ├──m_mod.py
# │ └──dir_dir
# │ └──dir_mod.py
# ├──m1.py    # 执行文件1
# ├──m2.py    # 执行文件2
# └──m3.py    # 执行文件3 # m1.py 导入dir/m_mod.py 方式一
# m2.py 导入dir/m_mod.py 方式二
# m3.py 导入dir/dir_dir/m_mod.py
test = 'jmz'
def fun():
print('dir_dir/dir_mod.py')

dir/dir_dir/dir_mod.py

addr = '上海'
def get_addr():
print(addr)

dir/m_mod.py

from dir import m_mod
# 已当前执行文件为基础,进入dir 文件夹 导入m_mod 模块
# 步骤:
# 1、创建模块名称空间m_mod
# 2、执行m_mod 代码 m_mod.get_addr() #上海

m1.py

from dir.m_mod import get_addr
# 进入dir文件夹下的导入m_mod 模块的get_addr 方法,
# 步骤:
# 1、创建m_mod 模块空间
# 2、将m_mod 模块空间内的get_addr 方法名和引入地址,添加到当前的模块空间的名称空间中 get_addr()

m2.py

from dir.dir_dir import dir_mod
# 进入 dir 文件夹下的dir_dir 文件夹目录下,导入dir_mod 模块 dir_mod.fun()

m3.py

# 总结:

# 根据上面的m1.py,m2.py,m3.py ,我们可以通过from 进入当前执行文件所在目录的下一级目录,导入模块
# from dir import m_mod # 导入下下一级模块, 需要通过from 当前目录文件夹.下级目录文件夹 导入模块
# from dir/dir_dir import dir_mod

  2.1.2 上级目录模块导入

# 疑问????
# 我们经常可以看到一些python 文件中 写着如下的代码
# import os
# import sys
# import time
# ...... # 按照上面导入模块的思路,很明显当前的目录是没有这些模块的,哪这些模块哪里来的????
# 导入顺序:
# 模块在导入时会根据sys.path的列表中罗列出的 顺序从左往右依次查找
import sys
print(sys.path)
# 你会发现第一个目录是你的当前文件执行的目录
# 也就是说它会先从当前执行文件的目录开始找模块然后依次往后,
# 这也就是为什么我们有时写一个内置模块一样的名字时,调用时没有找到该方法的原因
# 上面我们已经知道了导入顺序,以及导入方法
# 那我们现在只需要将 我们想导入的模块的那一级模块加入到sys.path中去不就可以了吗 # 在dir/dir_dir 中新建一个new_mod.py 文件,导入m1.py import os,sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
# __file__ 当前文件的相对路径
# os.path.abspath() 获取相对文件路径的绝对路径
# os.path.dirname() 获取文件或文件夹的当前所在目录 import m1

如何导入上级或者更上级的目录呢?

  2.2 相对路径导入

# 运用场景:
#   1、只能在被导入时才可以使用相对模块导入
#   2、一般会在包中使用的多
from . import test as test1             # 导入当前目录下的test模块 并起模块名为 test1

from .. import test as test2            # 导入上一级目录的test模块 并起模块名 为test2

from ... import test as test3           # 导入上上一级目录的test模块 并起模块名 为test3

# ....   依次类推 上上上一级模块  

三、包的使用

  3.1 什么是包?

# 包是一个有层次的文件目录结构,它定义了由n个模块或n个子包组成的python应用程序执行环境。
# 通俗一点:包是一个包含__init__.py 文件的目录,该目录下一定得有这个__init__.py文件和其它模块或子包。

  3.2 如何使用

# 举例包的场景:
# aaa # aaa包
# └──__init__.py  # 包文件
# test.py # 在 test.py 文件中 import aaa
# 首次导入aaa 包的过程
# 1、以包下__init__.py为准产生一个名称空间
# 2、执行__init__.py 的代码,将产生的名字放入名称空间
# 3、将aaa指向__init_py的名称空间
print('aaa.__init__')

aaa/__init__.py

import aaa
# aaa.__init__

test.py

  复杂情况下的使用

# aaa                   # aaa包
# ├──bbb    # aaa 下的子包bbb
# │ ├──__init__.py
# │ └──m_mod.py # 子包下的模块
# ├──__init__.py  # 包文件
# ├──m1.py    # 模块1
# └──m2.py    # 模块2
# aaa_mod1.py. 执行入口文件
print('aaa.__init__')

aaa/__init__.py

from . import m_mod

print('bbb.__init__')

aaa/bbb/__init__.py

from .. import m1

def fun_m_mod():
print('m_mod') m1.func_m1()
# 在执行代码时调用了

aaa/bbb/m_mod.py

from . import m2

def func_m1():
print('m1')

aaa/m1.py

def m2():
print('m2')

aaa/m2.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author Jmz from aaa import bbb
# 执行顺序
# 1、先执行包文件aaa/__init__.py
# 2、后执行包文件aaa/bbb/__init__.py print('aaa_mod1')
bbb.m_mod.fun_m_mod() # 最后结果
# aaa.__init__ # 先执行了aaa.__init__py
# m1 # 在执行bbb/__init__.py 时,先导入了m_mod ,在执行m_mod.py时,
# 分别有导入了m1,m2 ,导入完成后执行后续代码,在执行到m1.func_m1(),调用了m1的func_m1方法
# bbb.__init__ # 导入完后执行了print('bbb.__init__')
# aaa_mod1
# m_mod

aaa_mod1.py 入口执行文件

四、开发规范

# 软件名称
# ├──bin   # 程序入口文件
# ├──config  # 配置信息存放目录
# ├──core  # 核心包 模块
# ├──db  # 数据库包
# ├──lib  # 第三方组件
# ├──log  # 日志记录目录
# └──REAMDE.md     # 说明文件 # 更好的管理自己的项目使代码结构更清晰

  

python 模块与包的更多相关文章

  1. Python/模块与包之模块

    Python/模块与包之模块 1.什么是模块? 模块就是py文件 2.为什么要用模块? 如果在解释器上进行编码,把解释器关闭之前写的文件就不存在了,如果使用模块的话就能永久保存在磁盘中. 3.如何使用 ...

  2. Python模块、包、异常、文件(案例)

    Python模块.包.异常.文件(案例) python.py #模块 # Python中的模块(Module),是一个Python文件,以.py文件结尾,包含了Python对象定义和Python语句, ...

  3. 【Python】解析Python模块与包

    模块 模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块. import语句是用来导入模块或者从模块里导入特定的类或者函数.如前面我们用过的math模块,从而可以 ...

  4. python 模块和包深度学习理解

    python 模块和包 简单说相当于命名空间 1,python 模块        python模块就是一个文件,里面有函数,变量等 import 模块 模块.方法 from 模块 import fu ...

  5. (三)运用Python模块和包

    1 引言 为了能够在Python项目中高效地运用Python模块和包,我们需要进一步地来了解它们是如何在Python项目中进行定义.使用和工作的. 2 Python模块和包 Python模块和包的基本 ...

  6. Python模块04/包/logging日志

    Python模块04/包/logging日志 目录 Python模块04/包/logging日志 内容大纲 1.包 2.logging日志 3.今日总结 内容大纲 1.包 2.logging日志 1. ...

  7. Python模块和包

    模块和包是python组织代码的基本方式. 模块: python的每一个脚本文件都可称之为模块,模块的名称就是脚本的文件名.例如当我们写了一个test.py的脚本文件,则可以在同目录下的另外一个脚本m ...

  8. python模块与包的导入

    1. 模块与包的区别 模块,即module,一个包含python语句的.py文件就是一个模块!每个源代码文件都会自动成为模块!没有额外的语法用来声明模块. 包,又称模块包,即module packag ...

  9. python模块及包的导入

    一.模块 通常模块为一个文件,直接使用import来导入就好了.可以作为module的文件类型有".py".".pyo".".pyc".&q ...

  10. 简述Python模块和包

    我们常常会使用别人写的包,假如我们使用的是Python3.4版本,安装在windows的C盘根目录下,那么外部的包一般放在:C:\Python34\Lib\sit-packages下,此目录下有以.p ...

随机推荐

  1. linux下播放组播流出现setsockopt:No such device错误

    在linux下播放组播流出现setsockopt:No such device错误是因为多播IP没有add路由表里面 可以采用如下命令完成: root@android:/ # busybox rout ...

  2. Android性能优化典例(一)

    在Android开发过程中,很多时候往往因为代码的不规范.api使用不恰当.控件的使用场景考虑不全面和用户不恰当的操作等都能引发一系列性能问题的,下面就是我目前整理的一些Android开发过程中需要注 ...

  3. 使用swift语言进行IOS应用开发

    在Swift中能够直接使用Objective-C语言提供的api (包括系统框架与自己的定制代码),也能够在Objective-C中使用Swift提供的类和api ,还能够在一个工程中同时混合使用Sw ...

  4. Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信

    Android BLE与终端通信(三)--客户端与服务端通信过程以及实现数据通信 前面的终究只是小知识点,上不了台面,也只能算是起到一个科普的作用,而同步到实际的开发上去,今天就来延续前两篇实现蓝牙主 ...

  5. 面试之路(18)-java的函数参数传递类型之值传递还是引用传递

    关于这个问题争论了很久,最近也是偶然发现这个问题 经典名言: O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts ...

  6. 记录一下Maven整合spring,hibernate,strusts2我程序中出的bug

    action类如下 package com.itheima.movenweb.action; import java.util.List; import org.apache.struts2.Serv ...

  7. IndexedDB,FileSystem- 前端数据库,文件管理系统

    "我们不再需要下载并且安装软件.一个简单的web浏览器和一个可供使用的互联网就足以让我们在任何时间, 任何地点, 还有任何平台上使用任何web应用程序." web应用很酷, 但是相 ...

  8. majority element(数组中找出出现次数最多的元素)

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  9. sqlplus 登录数据库

     sqlplus pams/pamscncc@ORCLMIS

  10. Ubuntu16.04部署phantomjs的一个问题

    首先phantomjs是作为pyspider的一个外部依赖组件部署的. apt安装完出现问题: QXcbConnection: Could not connect to display Phantom ...