第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 否则会陷入死循环
以保留字命名的.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 否则会陷入死循环