手记

【Python入门】10.模块、包与作用域

目录
模块
模块的基本介绍

编写模块
作用域
内置模块
第三方模块
模块搜索路径

[TOC]

模块

模块的基本介绍

Module,即模块、组件的意思。在Python中,一个.py文件即是一个模块。在编写程序时,可以引用其他模块,在编写完成后又可以作为模块被其他程序引用。相同的函数名与变量名可以存在不同的模块中而不产生冲突。

使用模块的好处:提高代码的可维护性,编写程序可引用其他模块而更为方便。

为了避免模块名字与另外的模块名字产生冲突,可以通过用包来组织模块。如下

mywork├─ \__init__.py├─ aaa.py└─ ccc.py

mywork是一个包名,在其目录下必须存在_init.py这一文件,否则则视为普通的目录而非一个包。事实上,_init.py也是一个模块,它的模块名就是mywork。

当一个模块被包组织起来,它的模块名就会发生变化,如aaa.py的模块名变成了mywork.aaa,ccc.py的模块名变成了mywork.ccc。

包还能有多级目录,如

mywork
 ├─ work
 │  ├─ __init__.py
 │  ├─ aaa.py
 │  └─ one.py
 ├─ __init__.py
 ├─ aaa.py
 └─ ccc.py

此时,在work里面的aaa.py的模块名为mywork.work.aaa,在mywork里面的aaa.py的模块名为mywork.aaa。

编写模块

先给出一个简单的模块编写代码

#! /user/bin/env python3# -*- coding utf-0 -*-' a text module'__author__ = 'San bei'import sysdef add(x, y):
    return x + y

第1、2行是标准注释,第1行的注释#!/user/bin/env python3使得这个模块可以直接在Unix/Linux/Mac上运行,第2行注释# -- coding:utf-8 --表示文件使用标准的utf-8编码。

第4行是模块的文档注释,任何模块代码的第一个字符串都被当作是模块的文档注释。

第6行使用模块的_author_变量写入模块的作者

以上就是Python模块的标准文件模板,可以不写,但还是建议按照标准格式构建模块。

接下来是模块的真正代码部分。

将它保存为text.py,在命令行模式直接运行模块,结果如下:

>>>text.py3

这个模块还能被引用,在交互式模式下引用模块,结果如下:

>>>import text3>>>text.add(5, 2)7

会发现在用import引入模块后,会执行被引用的模块,输出我们不需要的结果3。要解决这个问题,要在模块编写的时候加上if _name_ == '_main_',像这样:

#! /user/bin/env python3# -*- coding utf-0 -*-' a text module'__author__ = 'San bei'import sysdef add(x, y):
    return x + yif __name__ == '__main__':
    print(add(1, 2))

这是是什么意思呢?我们知道.py文件就是一个模块,可以直接运行,那么当模块直接运行的时候,模块的_name属性会变为_main。而当模块被引用时,模块的_name属性还是_name

所以,这一行代码的意思是当模块直接运行时,就会执行下面的代码,当模块被引用时则不会执行下面的代码。

一般而言,在编写模块时都会加上这一语句,因为在引用模块时,只需要模块内的函数,而不需要该模块本身输出的结果。

这时候引用模块就不会输出3了:

>>>import text>>>text.add(5, 3)8

作用域

在定义变量名时,会有这样约定俗成的编程习惯。

正常的函数或变量名是公开的,像abc,xxy,PI,称为public变量,可以被直接引用

类似_xxx这样的变量是一些特殊变量,如上面提到的_name,我们不会用这样的方式来定义变量

类似_xxx这样的变量是非公开的,称为private变量,不应该被直接引用。

可以通过一个公开的函数把非公开的函数隐藏起来,这样内部的逻辑就不会公开,如(下面例子转自廖雪峰的官方网站)

def _private_1(name):
    return 'Hello, %s' % namedef _private_2(name):
    return 'Hi, %s' % namedef greeting(name):
    if len(name) > 3:        return _private_1(name)    else:        return _private_2(name)

内置模块

在编写程序时,我们可以引用Python内置的模块来简化程序的编写过程。需要注意的是,在我们自己编写模块时,模块名不要与内置模块名相同,也不要与内置函数名相同,否则会发生冲突。Python所有内置的函数

比如我们编写了一个sys.py的模块,这样系统内置的sys模块将不能被导入。

第三方模块

除了引用Python系统的内置模块之外,我们还能引用第三方模块,一般来说,第三方库都会在Python官方的网站注册。

在安装了包管理工具pip之后,就可以通过pip来安装第三方模块了。

pip install Pillow

在命令行模式下输入pip install Pillow,便会安装第三方模块Pillow。

模块搜索路径

但我们加载一个模块时,Python会在指定目录下搜索这一.py文件,如果搜索不到则报错。

默认情况下,Python会先搜索当前目录。Python的搜索路径存放在sys模块的path变量中。

如果找不到模块,我们可以手动添加自己需要的搜索目录,有三种方法。

• 动态添加目录
>>> import sys>>> sys.path.append('C:\\Users\michael\my_py_scripts')

临时生效,对于不经常使用的模块,这通常是最好的方式。

• 设置 PYTHONPATH 环境变量

如果是win7系统的话,可以通过右键计算机--->属性--->高级系统设置--->环境变量进行设置。

该环境变量的内容会被自动添加到模块搜索路径中,Python本身的搜索路径不会受到影响。

• 增加 .pth 文件

在Python目录下的lib\site-packages里面增加.pth文件,内容为需要添加的路径即可。



作者:三贝_
链接:https://www.jianshu.com/p/07a3111dade8


0人推荐
随时随地看视频
慕课网APP