Python一一高级模块话题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanyin235/article/details/83104166

在模块中隐藏数据

最小化from *的破坏:_X和__all__

       1.把下划线放在变量名前面(例如_X)可以防止客户端使from *语句导入模块名时,把其中的那些变量名复制出去

       2.在模块顶层把变量名的字符串列表赋值给变量__all__,使from *语句只会把列表中的这些变量名复制出来

混合用法模式:__name__和__main__

每个模块都有个名为__name__的内置属性,Python会自动设置该属性:

       如果文件是以顶层程序文件执行,在启动时,__name__就会设置为字符串“__main__”

       如果文件被导入,__name__就会设成客户端所了解的模块名

结果就是模块可以检测自己的__name__,来确定它是在执行还是在导入。

以__name__进行单元测试

测试案例:

print('I am:',__name__)

def minmax(test, *args):
    res = args[0]
    for arg in args[1:]:
        if test(arg, res):
            res = arg
    return res

def lessthan(x, y): return x < y
def grtrthan(x, y): return x > y

if __name__ == '__main__':
    print(minmax(lessthan, 4, 2, 1, 5, 6, 3))
    print(minmax(grtrthan, 4, 2, 1, 5, 6, 3))

这样,__name__检查区块内封装了自我测试的调用,使其在文件作为顶层脚本执行时才会启动,而导入时则不会。

如下,顶层启动时运行结果:

如果我们导入这个文件,其名称不是__main__,就必须明确地调用这个函数来执行:

import minmax
minmax.minmax(minmax.lessthan, 's', 'p', 'a', 'm')

运行结果:

使用带有__name__的命令行参数

修改模块搜索路径

也就是修改名为sys.path(内置模块sys的path属性)的内置列表。sys.path在程序启动时就会进行初始化,但在那之后,可以随意对其元素进行删除,附加和重设。

示例如下:

注意:sys.path的设置方法只在修改的Python会话或程序(即进程)中才会存续。在Python结束后,不会保留下来。

Import语句和from语句的as扩展

import和from语句都可以扩展,让模块可以在脚本中给予不同的变量名:

import modulename as name

相当于:

import modulename
name = modulename
del modulename

同样,也可以使用列在as之后的变量名来引用该模块:

from modulename import attrname as name

此外,包导入功能也可以为整个目录路径提供简短、简单的名称:

import dir1.dir2.mod as mod

模块是对象:元程序

要取得M模块内名为name的属性,可以使用结合点号运算,或者对模块的属性字典进行索引运算(在内置__dict__属性中显示)。Python也在sys.modules字典中导出所有已加载的模块列表(也就是sys模块的modules属性),并提供一个内置函数getattr,让我们以字符串名来去除属性。因此,下列所有表达式都会得到相同的属性和对象

M.name
M.__dict__['name']

sys.modules['M'].name
getattr(M, 'name')

用名字字符串导入模块

如果我们希望呈现在运行时以一个字符串的形式获取要导入的模块名称,可以如下操作:

exec唯一的、真正的缺点是:每次运行时它必须编译import语句,如果它运行多次,使用内置的__import__函数来从一个名称字符串载入的话,代码可能会运行的更快:

模块陷阱

猜你喜欢

转载自blog.csdn.net/xuanyin235/article/details/83104166