Python模块基础

概念: 在Python中,一个.py文件就称之为一个模块(Module)

好处:

1. 提高可维护性

2. 可重用

3. 避免函数名、变量名冲突。 每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中。因此我们自己在编写模块时,不必考虑名字会与其他模块冲突

模块种类:

1. 内置标准模块(标准库)。执行help(‘modules’)查看所有Python自带模块列表

2. 第三方开源模块,可通过 pip install 模块名 联网安装

3. 自定义模块

 

模块的导入路径:

模块调用:

import module       # 整个模块都导入

from module import xx   #  从某个模块里面导入它的一个小模块, 如: from random import randint     (这种方法导入的模块用的时候直接:randint(x,x)就行,前面就不用再加random.  , 因为你都没有导入random模块), 利用这种方法可以导入多个小模块,中间加逗号(“ , ”)就行。

from module.xx.xx import xx as rename   # 从模块的某个目录下导入某个小模块(或者是文件夹的形式),如: from django.core import handlers  。 as rename是对导入的模块在你这个程序中重命名,如:import multiprocessing as mulpro     以后在你这个程序中利用 mulpro. 就行

from module.xx.xx import  *     #  从模块的目录下导入所有的小模块,以后调用小模块的时候就不用再在小模块前加大模块的前缀, 如: from socket import *      在你的程序里调用socket的小模块时,直接写小模块的名字就行, 前面不需要再加 socket. 。 注意: 不建议用这种方式导入, 有可能这个小模块名跟你程序的变量名或者你导入的其他模块的小模块名发生重名冲突。

注: 模块一旦被调用,就相当于执行了另一个py文件里的代码, 如:

 

导入自己写的py文件:

自己写的 import练习.py 文件内容如下:

def sayhi(cmd):
    print('hello',cmd)

def saybye(cmd):
    print('bye',cmd)

 

导入如下:

 

上面的 import练习.py 文件如果改成:

def sayhi(cmd):
    print('hello',cmd)

def saybye(cmd):
    print('bye',cmd)

sayhi('abc')

 

import import练习.py这个文件后,会直接打印“heoll,abc ”,因为调用这个模块就相当于把这个py文件中的代码从上到下走了一遍

 

从上面的导入图可以看出,我导入的时候是专门进入到文件所在的目录去import的, 那是因为导入的时候Python并不会去系统的全局去寻找你所导入的文件,如果你专门进入了某个目录启动Python,它会在这个目录中搜寻并导入,如果你没写导入目录,它会去默认的路径中去搜寻, 查看默认路径的方法:

import sys
sys.path

# 通过以上代码会打印出它的默认搜索路径。
# 我电脑的搜索结果:
#  ['', 'D:\\python\\Lib\\idlelib', 'D:\\python\\python36.zip', 'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', 'D:\\python\\lib\\site-packages', 'D:\\python\\lib\\site-packages\\chardet-3.0.4-py3.6.egg']   # 在这个列表中的路径从左到右寻找,第一对引号下面表示是“当前目录”,所以默认是先从当前目录去找,如果当前目录没找到,就往后依次找。  sys.path是个列表,你也可以自己利用sys.path.append()往里面添加路径,但你自己导入的这个路径只是在你这个程序里面添加了,在其他程序里面的sys.path里面是没有的,当你把这个程序关闭后,就不能利用你自己添加的那个路径,也就是说这个路径是一次性,只在你这个程序中有效。

#
'D:\\python\\Lib\\idlelib', 'D:\\python\\python36.zip'
#'D:\\python\\DLLs', 'D:\\python\\lib', 'D:\\python', # 这些是Python自带的安装包相关的东西

# site-packages  # 所有的标准库,包括自己安装的第三方库

注:import module 是导入到内存中了

 

开源模块安装方式:

https://pypi.python.org/pypi  是Python的开源模块库

安装方式:

1. 手动安装:  在cmd中进入所需安装模块的目录,在命令行输入: python setup.py build    

                        build成功后在命令行再输入: python setup.py install

 注:安装在了Python的site-packages下

2. 联网安装: pip install 模块名

3. 国内资源下载: 

 

包:(Package)

当你的模块文件越来越多,就需要对模块文件进行划分,比如把负责跟数据交互的都放在一个文件夹中,把与页面交互相关的放在一个文件夹。

像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包。

假如我运行 manage.py并需要导入crm文件下的 views.py, 由于crm文件跟 manage.py在文件夹my_proj是同一层,可以如下导入:

from crm import views  # 所需要导入的文件在crm的多少层, 导入的时候就在 crm后面加多少个点, 如: crm.xx.xx.xxx

views.xx()   

 

以上是Python3的导入方法。 Python2导入自写文件夹时,需要在导入的文件夹中加上一个命名为“__init__.py ”(init两边各两个下划线, init是initiate(初始化)的缩写)的空文件,这样自写的文件夹就变成了包。

就是说,Python2只有在文件夹中加入了“__inti__.py”这个空文件,这个文件夹才会变成包,但Python3加不加这个“__init__.py”空文件都无所谓,但为了规范,最好加上。

运行的 manage.py的时候导入了 crm 下的 views.py ,  如果views.py 又需要导入 配置文件 my_proj 下的settings.py ,可以如下导入:

from my_proj import settings  # my_proj是配置文件

settings.xx()

# 正常来说, 由于views.py 和 setting.py 没在同一个文件夹中,也没像manage.py和crm 在同一级别, 这样导入是不行的。 但由于 manage.py 在导入 views.py 的时候,已经把 manage.py 所在的变量添加到了环境变量(即 sys.path这个列表中的第一个元素)中,所以 这次导入的时候,Python会搜索 manage.py 所在路径下的所有文件(只会在manage.py这一层找)。 
# 所以说, 把路径添加到环境变量中的时候, 添加的是程序的主入口函数(即:manage.py)所在的路径, 而跟导入的模块(如: views.py)所在的位置、导入文件时进入了多少层没有一点关系。

 

相对导入:

cd.. 是返回上一层文件夹

cd..\.. 是往上返回两层   这个 .. 就是指相对路径

还是上面的例子, manage.py 调用views.py, views.py 需要调用同目录下的 models.py,在views.py中导入models.py时不能这样写: import models   。 因为,主函数是 manage.py,所以只是manage.py 所在的路径添加到了 os.path中了, 所以 Python只会在 manage.py这一层去寻找 models。所以,即使views.py和 models.py是在同一目录下,也不能直接导入。

导入同一目录下的py文件,可以用以下写法:

from . import module  # from . 就表示当前目录下导入。  这个 . 就叫做相对的导入

 在涉及到相对导入时,package所对应的文件夹必须正确的被Python解释器视作package,而不是普通文件夹。否则由于不被视作package,无法利用package之间的嵌套关系实现Python中包的相对导入。

文件夹被Python解释器视作package需满足两个条件:

1. 文件中必须有__inti__.py 文件,该文件可以为空,但必须存在该文件。

2. 该文件夹中的py文件不能作为顶层模块来执行(即不能作为主函数的入口)。 (相对导入不能相对到了程序的根目录)

注: 虽然Python支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错,所以不建议在项目里经常使用(form . 用的比较多一点,from .. 用的比较少)

 

posted @ 2018-02-06 11:32  neozheng  阅读(289)  评论(0编辑  收藏  举报