python学习手册笔记--第21~24章

第21~22章    模块及模块的编写
以保留字命名的.py不能导入
from module1 import *    顶层所有赋值的拷贝
import和from都是赋值语句,可以放在if中
说明:
1.模块语句会在首次导入时执行
2.顶层赋值语句会创建模块属性
3.模块的命名空间能通过属性__dict__或dir(M)获取
4.模块是一个独立的作用域(本地变量就是全局变量)

第23章    模块包
import dir1.dir2.mod        会自动运行dir1,dir2下的__init__.py文件6
from dir1.dir2.mod import x
dir1和dir2目录下必须有__init__.py文件,可以为空
扮演初始化钩子,替目录产生模块命名空间,以及使导入目录实现from *
__all__指利用from *,应导入的模块清单
from . import **    会忽略sys.path上的路径
from .. import **    导入父目录下的
相对导入只适用于from语句
文件中写import **在2.6中是相对的,在3.0中是绝对的,因此,应写成from . import **
3.0中不能略过导入包的主目录    import a.**    a下的文件依然可见

第24章    高级模块话题
最小化from *的破坏:_X和__all__=['','',……]
_X:变量将不会被复制    __al__:将只复制__all__列表中的变量
启用以后的语言特性:    from __future__ import featurename
__name__和__main__:        写在模块最后,自我检测
模块运行时,__name__==__main__    模块导入时,__name__==相应的文件名
sys.argv包含了命令行参数
import from都可以用as扩展,作为别名
M.name      M.__dict__['name']      sys.modules['M'].name    getattr(M,'name')
以上都会得到模块M的name变量
exec函数:编译一个代码字符串,并且将其传给python解释器以执行    
以字符串方式导入:    modname="string"    exec("import " + modname)
            modname="string"    string=__import__(modname)
当reload模块时,必须把每个模块都reload,可以通过递归实现
递归遍历所有__dict__.values()中ModuleType类型的模块名,实现过渡性重载工具
from 复制变量名,而不是连接
#nested1.py      x=99    def printer():print(x)
#nested2.py    from nested1 import x, printer
x=88        修改是复制的 x only    
printer()>>>    99
from module import x;    reload(module);    此时x依然为原来的x
避免这个陷阱可以通过    import及.运算来解决
不要在递归导入中使用from    否则会陷入死循环

猜你喜欢

转载自blog.csdn.net/cx351864995/article/details/7295992