python--import

以下适用于3.0之前的 版本,3.0后版本有改动,详见https://www.python.org/dev/peps/pep-0420/

1. 模块

在编写程序的时候,经常引用其他模块,包括Python内置模块和第三方的模块以及自定义模块
导入模块时,是按照sys.path变量的值搜索模块,sys.path的值是包含每一个独立路径的列表,包含当前目录、python安装目录、PYTHONPATH环境变量,搜索顺序按照路径在列表中的顺序(一般当前目录优先级最高

例一:

可以执行脚本成功,但只能导入当前目录的python文件,子文件web不能直接导入,会报ImportError


Paste_Image.png
sys.path:
['/home/fantao/workspace/work', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-x86_64-linux-gnu', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/fantao/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/wx-3.0-gtk2']

常见问题
如何引入某一特定路径下的模块

  1. 使用sys.path
    • sys.path.append
    • sys.path.insert
  2. 将一个路径加入到python系统路径下,避免每次通过代码指定路径
    • 利用系统环境变量 export PYTHONPATH=modulepath, 只在执行命令当前终端界面有效
    • 直接将这个路径链接到类似/Library/Python/2.7/site-packages目录下

建议:

  1. 一般不推荐使用from module import *, 容易覆盖当前名称空间中现有的名字,适合模块中变量名很长并且变量很多的情况
  2. 自定义的名称替换模块的原始名称,import testhello as th

2. package

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

Paste_Image.png
  • __init__.py的第一个作用就是package的标识, 可以将import web
  • __init__.py是一个python文件,可以用来写python模块, 但不建议书写

优点

  • 提高了代码的可维护性
  • 避免函数名和变量名以及模块名冲突

3. 作用域

  1. 正常的函数和变量名是公开的, 可以被大家调用
  2. 类似__xxx__这样的变量是特殊变量,可以被直接引用,一般具有特殊用途, 定义变量一般不用这种变量名
  3. 类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用, 但也是可以被引用的

4. import

Paste_Image.png

from module import *, 默认导出不以下划线开头的所有成员, 如下

In [3]: from hello import *
In [5]: age
Out[5]: 18
In [6]: _name
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in ()
----> 1 _name

NameError: name '_name' is not defined

In [7]: test_hello()
hello

In [8]: _test_name()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
 in ()
----> 1 _test_name()

NameError: name '_test_name' is not defined

import module, 会导出所有的变量和函数

In [9]: import hello

In [10]: hello.age
Out[10]: 18

In [11]: hello._test_name()
xiaoming

In [12]: hello._name
Out[12]: 'xiaoming'

In [13]: hello.age
Out[13]: 18

你可能感兴趣的:(python--import)