模块是个什么东西?

模块

1、定义:模块:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能),本质上是.py结尾的python文件(文件名;test.py ,对应的模块名:test)。

2、模块导入方法

import module_name
import module_name,module2_name
from module_alex import* #建议不用
from module_name import m1,m2,m3
from module_name import m1 as a1

3、import 本质(路径搜索和搜索路径)

导入模块的本质就是把python文件解释一遍
导入包的本质就是解释(执行)该包下的__init__.py 文件

4、导入优化(任何Python程序都可以作为模块导入)

from module_name import m1,m2
5.模块分类
a.标准库
b.开源模块,第三方模块
c.自定义模块

 

6.模块搜素路径

当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
sys.path的初始值来自于以下地方:
    包含脚本当前的路径,当前路径
    PYTHONPATH #环境变量
    默认安装路径
sys.path初始化完成之后可以更改
 

7.导入循环(交叉引用)与import原理

导入循环:两个模块互相导入

import原理:将导入的模块执行一遍

在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。

解决方法:

将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。

错误示范

b.py

import os
import a
 
def get_size(file_path):
 
    if a.file_exists(file_path):
        file_size=os.path.getsize(file_path)
        print('the file %s size is[%s]' %(file_path,file_size))

a.py

import os
import b
 
def file_exists(file_path):
    return os.path.isfile(file_path)
 
def download(file_path):
    b.get_size(file_path)
    print('download file %s' %file_path)
 
def upload(file_path):
    print('upload file %s' %file_path)
 
download('a.txt')

解决方法:修改b.py

import os
 
def get_size(file_path):
    import a
    if a.file_exists(file_path):
        file_size=os.path.getsize(file_path)
        print('the file %s size is[%s]' %(file_path,file_size))

a.py不变

 

包(package)

:用来从逻辑上组织模块的:本质上是一个目录(必须带有一个__init__.py 文件)

  通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。

  在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。

可以从包中导入单独的模块。

  1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名
  2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。
  3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA
 
  为了组织好模块,将多个模块分为一个包。包是python模块文件所在的目录,且该目录下必须存在__init__.py文件。常见的包结构如下:
package_a
├── __init__.py
├── module_a1.py
└── module_a2.py
package_b
├── __init__.py
├── module_b1.py
└── module_b2.py
main.py
  • 如果main.py想要引用packagea中的模块modulea1,可以使用:
from package_a import module_a1
import package_a.module_a1
  • 如果package_a中的module_a1需要引用package_b,那么默认情况下,python是找不到package_b。我们可以使用sys.path.append('../'),可以在packagea中的__init__.py添加这句话,然后该包下得所有module都添加* import __init_即可。
  • 如果package_a中的module_a1需要引用package_b下的module_b1:
  • #在module_a1里
    import os,sys #dirname返回目录名不要文件名 print(__file__)#相对路径 print(os.path.abspath(__file__))#绝对路径
    +相对路径 print(os.path.dirname(os.path.abspath(__file__)))#上一级 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#上两级 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)#把路径添加到python的搜索路径集 from package_b import moduel_b 1

     

posted @ 2017-02-16 18:59  似是故人来~  阅读(771)  评论(0编辑  收藏  举报