美文网首页
01.Python模块与模块加载

01.Python模块与模块加载

作者: 杨强AT南京 | 来源:发表于2018-09-26 13:51 被阅读55次

    Python系列技巧文章,主要用力强化Python变成技巧。


    一、通识

    1、Python中一个python文件就是一个模块。

    2、模块通过引用可以得到执行。

    3、模块引用的方式:import,fromimport,reload函数,exec函数


    二、import与from

    使用import与from加载莫模块,代码也能得到执行。

    例子:

            文件1:main_module_import.py

    #coding=utf-8

     import  sub_module_1

    print('this is a main module!')

            文件2:sub_module_1.py

     #coding=utf-8

     from sub_module_2 import *

     print('this is a submodule-1')

            文件3:sub_module_2.py

    #coding=utf-8

    print("this is a submodule-2")

            PyCharm开发工具下项目结构截图

    文件模块的项目工程截图

            运行结果

    import与from引用模块的结果

    三、reload函数

    reload函数在imp模块中,imp模块已经不推荐使用,替换的方案是importlib模块。

    1、reload函数使用有两个前置条件:

    1)只能加载前面已经引入过的模块!

    2)参数必须是模块对象,不是模块名或者模块字符串表示。

    2、reload函数执行机制(引用自官方标准库参考文档)

    (1)模块代码被重新编译,并且模块层代码被执行,对象被重新定义,并关联到模块字典中对应名称。扩展模块的init函数不会被二次调用。

    (2)与Python中的所有其他对象一样,旧对象仅在引用计数降至零之后才被回收。

    (3)模块命名空间中的名称被更新,并指向新的或已更改的对象。

    (4)对旧对象的其他引用(例如模块外部引入的名称)不会重新关联到新对象。如果需要,则必须在每个名称空间中更新这些引用。

    告诫

    当模块被重新加载时,它的字典(包含模块的全局变量)被保留。名称的重新定义将取代旧的定义,所以这通常不是问题。如果模块的新版本没有定义旧版本定义的名称,则旧定义仍然存在。

    3、例子:

    使用reload代码,文件:main_module_reload.py

    #coding=utf-8

    import imp

    import sub_module_1

    print('this is a main module!')

    imp.reload(sub_module_1)

    运行效果

    reload执行效果

    四、exec函数

    exec函数是内置函数。动态执行python代码。函数原型如下:

    exec ( object [, globals [, locals] ] )

    对象必须是字符串或代码对象。

    (1)如果它是字符串,则将字符串解析为一组Python语句,然后执行该语句(除非出现语法错误)。

    (2)如果它是代码对象,则简单地执行它。在所有情况下,所执行的代码作为文件输入都是有效的。请注意,在函数定义之外,甚至在传递给exec()函数的代码上下文中,也不能使用return和yield语句。返回值为“无”。

    例子:

    #coding=utf-8

    print('this is a main module!')

    re=exec("a=20;print(a);")

    print(a)

    print(re)

    #exec("class A:pass",globals=globals(),locals=locals())

    #不能带参数名,上面语句错误

    exec("class A:pass",globals(),locals())o=A()print(o)print(globals())

    运行效果

    exec的执行效果

    注:importlib的使用单独用一个主题来说明。

    代码下载:https://github.com/QiangAI/PythonSkill/tree/master/AdvPython

    相关文章

      网友评论

          本文标题:01.Python模块与模块加载

          本文链接:https://www.haomeiwen.com/subject/wjhdoftx.html