Python学习笔记(十四):模块高级
以Mark Lutz著的《Python学习手册》为教程,每天花1个小时左右时间学习,争取两周完成。 --- 写在前面的话
2013-7-23 21:30 学习笔记
1,包导入是把计算机上的目录变成Python的命名空间。包导入时也可以使用import和from语句。目录路径只能以点号.间隔。例如有这样一个目录结构:
dir0/dir1/dir2/mod.py
则导入语句如下:
import dir1.dir2.mod
导入时必须遵循如下规则:
- dir1和dir2目录中必须含有一个__init__.py文件
- dir0是容器,不需要__init__.py文件;如果有,也会被忽略
- dir0必须列在模块搜索路径中(即dir0必须是主目录,或是列在PYTHONPATH中,或是在.pth文件中)
2,__init__.py可以包含Python代码,也可以为空。它可以防止Python搜到名称相同的目录。通常__init__.py中会让一些初始化的代码。Python在首次导入时会自动执行该文件。
3,使用from *语句时,需要在__init__.py文件中用__all__列表定义需要导入的子模块的名称清单。
# File: dir1/__init__.py
x = 1
print 'dir1 init' # File: dir1/dir2/__init__.py
y = 2
print 'dir2 init' # File: dir1/dir2/mod.py
z = 3
print 'in mod.py'
导入包:
import dir1.dir2.mod
print dir1.x
print dir1.dir2.y
print dir1.dir2.mod.z
第一次执行该文件,输出结果:
dir1 init
dir2 init
in mod.py
1
2
3
4,在模块中隐藏数据是一种惯例,而不是一种语法约束。
5,使用from *语句时,Python会先寻找模块内的__all__列表,把其中的变量复制出来;如果没有定义__all__,则会复制开头没有单下划线(_X)的所有变量名。
__all__ = ["var1", "var2", "var3"]
要注意,这些约定只对from *有效,对import无效。
6,有些新的扩展特性需要使用类似如下的代码来导入。例如:
from __future__ import featurename
7,每个模块都有一个__name__内置属性,Python会自动设置它。如果文件以顶层程序文件运行,__name__属性会被设置成'__main__';如果文件被导入,__name__会被设置成客户端所了解的模块名。该特性常用来实现单元测试。例如:
def test():
print "This is a test." if __name__ == '__main__':
test()
8,通过修改sys.path的值可以修改模块的搜索路径。但这中修改只在该进程中才有效,Python结束后一切恢复如初。例如:
import sys
print sys.path
sys.path.append(r'd:\a\b')
print sys.path
输出结果为:
['', 'C:\\Python27\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages']
['', 'C:\\Python27\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'd:\\a\\b']
9,imort as扩展可以让模块在脚本中有自定义的名称,这可以让一些名称较长的变量具有短名称。包导入时也可以使用。例如:
import longmodulename as name1
from module imort longname as name2
10,由于import和from语句总是默认在sys.path的绝对路径中寻找模块,这使得如果当前目录下有个模块文件名与系统模块名重名,则会导入系统模块名。通过在from语句中使用.(表示当前目录)和..(表示当前目录的父目录)可以实现相对导入,从而避免这个问题。例如:
from . import D # imports A.B.D
from .. import E # imports A.E
from ..F import G # imports A.F.G
11,通常情况下,最好不要通过导入和重载来启动程序。
12,函数主体内的代码在函数被调用时采用执行。
13,不能递归imort,即不能A模块importB模块,B模块importA模块
14,通过变量名字符串导入模块有两种方法:
- 使用exec语句。缺点是每次执行时都必须编译import语句。默认情况下会走当前作用域内执行代码,也可以通过传入参数来自定义。例如:
modname = 'mod'
exec 'import ' + modname
- 使用内置的__import__函数,如果需要多次执行,这个方法可能会快一点。__import__方法会返回模块对象。
modname = 'mod'
mod = __import__(modname)
最新文章
- IT软件技术人员的职位路线(从程序员到技术总监) - 部门管理经验谈
- 在Web Api中集成protobuf
- 7、XML加强/Web开发/Tomcat
- CODEVS 1001 舒适的路线
- JavaScript空判断
- luoguP2265 路边的水沟
- 使用minidwep-gtk-PJ-wifi教程中文版
- 用 Python 测试框架简化测试
- 利用pyinstaller将python脚本打包发布
- WPF 中图片的加载 ,使用统一资源标识符 (URI)
- php 5.6,7.0静态方法调用和new调用方法性能差距
- JDK(java development kit java开发工具包)的安装
- beego 初体验 - 基础模块 - session, cookie
- Series.str——字符串批量处理方法
- UVA10562-Undraw the Trees(递归)
- idea打包 - 可执行jar包
- GitHub 新手教程 三,Git Bash
- BZOJ 3171 循环格(费用流)
- 【bzoj题解】1012 最大数
- Swift2.0语言教程之下标脚本