模块高级用法
- 下划线开始的变量名:
from *
导入该模块时,这类变量名不会被复制出去 - 模块文件顶层的变量名列表
__all__
:它是一个变量名的字符串列表。from *
语句只会把列在__all__
列表中的这些变量名复制出来。
2.当文件是以顶层程序文件执行时,该模块的__name__
属性会设为字符串"__main__"
。若文件被导入,则__name__
属性就成为文件名去掉后缀的名字
- 模块可以检测自己的
__name__
属性,以确定它是在执行还是被导入
4.import
和from
可以使用扩展,通过这种方法解决变量名冲突:
import modname as name1
from modname import attr as name2
在使用as
扩展之后,必须用name1
、name2
访问,而不能用modname
或者attr
,因为它们事实上被del
掉了
5.在import
与from
时有个问题,即必须编写变量名,而无法通过字符串指定。有两种方法:
- 使用
exec:
exec(“import “+modname_string)`
6.reload(modname)
只会重载模块modname
,而对于模块modname
文件中的模块,reload
函数不会自动加载。
要想reload
模块A
以及A
import
的所有模块,可以手工递归扫描A
模块的__dict__
属性,并检查每一项的type
以找到所有import
的模块然后reload
这些模块
modname.attr
:直接通过模块对象访问modname.__dict__['attr']
:通过模块对象的__dict__
属性字典访问sys.modules['modname'].name
:通过Python的sys.modules
获取模块对象来访问