模块高级用法
1.Python模块会默认导出其模块文件顶层所赋值的所有变量名,不存在私有变量名。所有的私有数据更像是一个约定,而不是语法约束:
- 下划线开始的变量名
_x
:from *
导入该模块时,这类变量名不会被复制出去 - 模块文件顶层的变量名列表
__all__
:它是一个变量名的字符串列表。from *
语句只会把列在__all__
列表中的这些变量名复制出来。Python会首先查找模块内的
__all__
列表;否该列表未定义,则from *
会复制那些非_
开头的所有变量名
所有这些隐藏变量名的方法都可以通过模块的属性直接绕开
2.当文件是以顶层程序文件执行时,该模块的__name__
属性会设为字符串"__main__"
。若文件被导入,则__name__
属性就成为文件名去掉后缀的名字
- 模块可以检测自己的
__name__
属性,以确定它是在执行还是被导入 使用
__name__
最常见的是用于自我测试代码:在文件末尾添加测试部分:if __name__=='__main__': #pass
3.在程序中修改sys.path
内置列表,会对修改点之后的所有导入产生影响。因为所有导入都使用同一个sys.path
列表
4.import
和from
可以使用as
扩展,通过这种方法解决变量名冲突:
import modname as name1
from modname import attr as name2
在使用as
扩展之后,必须用name1
、name2
访问,而不能用modname
或者attr
,因为它们事实上被del
掉了
5.在import
与from
时有个问题,即必须编写变量名,而无法通过字符串指定。有两种方法:
- 使用
exec:
exec("import "+modname_string)` 使用内置的
__import__
函数:__import__(modname_string)
,它返回一个模块对象这种方法速度较快
6.reload(modname)
只会重载模块modname
,而对于模块modname
文件中import
的模块,reload
函数不会自动加载。
要想reload
模块A
以及A
import
的所有模块,可以手工递归扫描A
模块的__dict__
属性,并检查每一项的type
以找到所有import
的模块然后reload
这些模块
7.可以通过下列几种办法获取模块的某个属性:
modname.attr
:直接通过模块对象访问modname.__dict__['attr']
:通过模块对象的__dict__
属性字典访问sys.modules['modname'].name
:通过Python的sys.modules
获取模块对象来访问getattr(modname,'attr')
:通过模块对象的.getattr()
方法来访问