Python的模块和包

模块

C/C++中的include仅仅是简单的文本替换,若包含的头文件中有函数定义,一旦头文件重复包含,就存在函数重复定义的问题,因此我们在写头文件时,都要加上#pragma once为我们写代码带来不便

1.模块也是对象
对象的三要素:类型 值 id
类型: <type 'module'>python中的内置类型
值:模块名和路径;模块中包含的信息很多,但呈现给我们程序员的只有我们所关注的模块的一些属性,采用模块的序列化(将一个结构体转换成字符串),自定制的序列化方式

import os
print id(os)
print type(os)
print os

执行结果:
140245180296448
<type 'module'>
<module 'os' from '/usr/lib64/python2.7/os.pyc'>

2.模块搜索路径:
当前路径
系统路径:·sys.path
python不但可以识别普通路径,也能识别压缩后的路径如列表中的第二个元素

.py文件经过编译后会生成.pyc文件,这是一个二进制文件,此时将.py文件移动到其他路径下,我们的程序仍然可以执行出结果,这就依赖.pyc文件。若将.pyc也移走,程序会抛出ImportError 导入模块异常。这时我们可以使用sys.path.append(依赖的包路径)包路径添加到系统路径下。

append()当于我们gcc下的 -I 选项,即添加我们依赖的文件的路径

3.import语句
import可以一次导入一个模块,也可以依次导入多个,推荐分开导入
导入顺序一般按照标准库、第三方库、自定制模块来导入

模块是对象,因此也可以进行赋值

import os.path
p = os.path
print p.exists(‘test.py’)

4.import as 语句
给模块取一个简单的别名

import os.path as p
print p.exists(‘test.py’)

这种方式与上面为模块赋值一样

5.from-import 语句
只引入模块中的某些内容,并不导入整个模块,这种方式耦合小,即使别人改变了模块中的其他内容,但并不影响我们自己的代码。

from os.path import exists
print exists(‘test.py’) # 这个时候不需要敲 os.path 了.

导入和加载
导入模块意味着模块中代码被执行,多次导入只会执行一次。
因为导入模块的过程是这样的:想将要导入的模块文件加载到内存中,并创使修改后的模块生效。个模块对象,然后通过变量名将该模块引入当前命名空间。
而执行动作是在加载时完成的,即使一个模块导入多次,但加载只进行一次,也就执行一次。

重新加载reload
当我在代码执行过程中修改了模块中的内容,想要使修改后的模块立即生效,并且不用终止当前程序,比如我们的服务器程序
这时我们就要使用一个函数reload()
一般应用于配置文件经常会重新加载

reload又称“热加载”,不终止程序的情况下, 就使改动生效
“冷加载” 即是要重启程序。

模块的内置变量

全局内置变量:
print globals()

{'__builtins__': <module '__builtin__' (built-in)>, '__file__': 'test.py', '__package__': None, 'sys': <module 'sys' (built-in)>, 'p': <module 'posixpath' from '/usr/lib64/python2.7/posixpath.pyc'>, 'add': <module 'add' from '../add.pyc'>, '__name__': '__main__', 'os': <module 'os' from '/usr/lib64/python2.7/os.pyc'>, '__doc__': None}

其中:

  • builtins: 内建函数模块. 包含了open, help, doc等内建函数的定义
  • name: 模块名字. 如果是从这个模块开始执行, 那么name值为main
  • file: 模块的文件名
  • doc: 模块的文档字符串
  • package:模块从属的包名

包(Package)

当我们的代码量很大时,就需要使用目录结构来管理多个模块。
我们创建一个cal这样的目录,在这个目录下创建add.py sub.py __init__.py 这样几个文件。

cal就成了一个包(Package),我们就可以导入这个包中的文件

import calc.add
print calc.add.Add(1, 1)

__init__.py 是在包加载的时候会进行执行, 负责一些包的初始化操作. 一般是空文件即可.

包中还可以嵌套其他包。

猜你喜欢

转载自blog.csdn.net/shidantong/article/details/81130148