本文主要介绍一些python module的一些有用的用法。
1. 使用_X和__all__
在引用模块时,有两种方法,一种是"import ...",另外一种是"from ... import ...".在使用后者时,有时因为 引用的名称较多,我们会选择”from ... import *",即将模块中的所有变量、函数及类全部导入到当前模块中。这样有时会造成命名空间污染,为了减小因“from ... import *”引起的污染问题,我们可以使用_X和__all__。例如:
# unders.pya, _b, c, _d = 1, 2, 3, 4
>>> from unders import * # Load non _X names only
>>> a, c
(1, 3)
>>> _b
NameError: name '_b' is not defined
__all__ = ['a', '_c'] # __all__ has precedence over _X
a, b, _c, _d = 1, 2, 3, 4
>>> from alls import * # Load __all__ names only
>>> a, _c
(1, 3)
>>> b
NameError: name 'b' is not defined
但要说明的是,python中没有类似C++的私有的概念,这两种方法只适用于"from ... imort *"的导入方法,并没有方法来组织模块中某个名称的导出。无论是哪种方法,我们都可以使用import ...或者from ... import ...方法来模块中的任何名称。
2. __name__
每个python模块都有__name__属性,当模块独立运行时,这个属性会被设置为"__main__",否则它名称为模块的名称(如文件名)。通常,模块会根据"__name__"是否等于"__main__"来决定是否运行一些单元测试代码。
3. 使用as重命名导入的模块或变量及方法名称
在导入时,可以使用as为导入的模块或名称进行重命名,如:
import sys as system
4.模块本身即对象
要获取一个模块的属性,事实上有很多种方式。如以下的所有方式都是用于获取模块M的name属性的:
M.name
M.__dict__['name']
sys.modules['M'].name
getattr(M, 'name')
其中第二种方法是因为python将模块中的所有名称及其内存的位置都存入了一个内部的字典__dict__中;而第三个是因为在python运行时,会将所有jiazai de 的模块及模块对象存入sys.modules这个字典中,并且提供了内置的getattr函数来获取指定模块的某个名称的属性值。这些也是dir的工作基础。
5.根据字符串导入模块
在实际的编程中,我们有时在编写程序过程中不能确定要导入的模块名称(例如名称需要在界面上输入),因此我们需要在运行时导入。这种情况可以使用以下方法来解决:
modname = 'string'
exec('import ' + modname)
或者:
modname = 'string'
string = __import__(modname)
或者通过importlib.import_module来完成:
import importlib
modname = 'string'
string = importlib.import_module(modname)
429

被折叠的 条评论
为什么被折叠?



