美文网首页
34.5-绝对导入、相对导入

34.5-绝对导入、相对导入

作者: BeautifulSoulpy | 来源:发表于2020-01-13 08:40 被阅读0次

    不要把自己活得像落难者一样,急着告诉所有人你的不幸。总有一天你会发现,酸甜苦辣要自己尝,漫漫人生要自己过,你所经历的在别人眼里都是故事,也别把所有的事都掏心掏肺的告诉别人,成长本来就是一个孤立无援的过程,你要努力强大起来,然后独当一面!

    总结:

    1. 使用相对导入的主模块不能再当作主模块运行;
    2. Python中就没有什么是藏得住的,你都可以改(特别是对于模块来讲)

    1. 绝对导入、相对导入

    绝对导入
    在import语句或者from导入模块,模块名称最前面不是以.点开头的
    绝对导入总是去模块搜索路径中找,当然会查看一下该模块是否已经加载

    相对导入
    只能在包内使用,且只能用在from语句中
    使用.点号,表示当前目录内
    ..表示上一级目录
    不要在顶层模块中使用相对导入

    举例a.b.c模块,c是模块,c的代码中,使用
    from . import d # imports a.b.d
    from .. import e # imports a.e
    from .d import x # a.b.d.x
    from ..e import x # a.e.x
    

    ... 三点表示上上一级
    使用下面结构的包,体会相对导入的使用
    注意:一旦一个模块中使用相对导入,就不可以作为主模块运行了

    2. 访问控制

    下划线开头的模块名
    _ 或者 __ 开头的模块是否能够被导入呢?
    创建文件名为 _xyz.py 或者 __xyz.py 测试
    可以成功的导入,因为它们都是合法的标识符,就可以用作模块名
    模块内的标识符

    # xyz.py
    print(__name__)
    A = 5
    _B = 6
    __C = 7
    
    __my__ = 8
    # test.py中
    import xyz
    import sys
    print(sorted(sys.modules.keys()))
    print(dir())
    print(xyz.A, xyz._B, xyz.__C, xyz.__my__)
    

    普通变量、保护变量、私有变量、特殊变量,都没有被隐藏,也就是说模块内没有私有的变量,在模块中定义不做特殊处理。

    使用from ... import *
    # xyz.py
    print(__name__)
    A = 5
    _B = 6
    __C = 7
    __my__ = 8
    # test.py中
    from xyz import *
    import sys
    print(sorted(sys.modules.keys()))
    print(dir())
    print(locals()['A'])
    A = 55
    print(locals()['A']) # 思考这个A是谁的A了
    
    使用 _all_

    _all_ 是一个列表,元素是字符串,每一个元素都是一个模块内的变量名

    总结

    一、使用 from xyz import * 导入

    1. 如果模块没有 all , from xyz import * 只导入非下划线开头的该模块的变量。如果是包,子模块也不会导入,除非在 all 中设置,或 init.py 中导入它们;
    2. 如果模块有 all , from xyz import * 只导入 all 列表中指定的名称,哪怕这个名词是下划线开头的,或者是子模块;
    3. from xyz import * 方式导入,使用简单,但是其副作用是导入大量不需要使用的变量,甚至有可能造成名称的冲突。而 all 可以控制被导入模块在这种导入方式下能够提供的变量名称,就是为了阻止from xyz ;import *导入过多的模块变量,从而避免冲突。因此,编写模块时,应该尽量加入 all

    二、from module import name1, name2 导入
    这种方式的导入是明确的,哪怕是导入子模块,或者导入下划线开头的名称;

    3. 模块变量的修改

    模块对象是同一个,因此模块的变量也是同一个,对模块变量的修改,会影响所有使用者。
    除非万不得已,或明确知道自己在做什么,否则不要修改模块的变量。
    前面学习过的猴子补丁,也可以通过打补丁的方式,修改模块的变量、类、函数等内容。

    # xyz.py
    print(__name__)
    X = 10
    # test2.py
    import xyz
    print(xyz.X)
    # test.py
    import xyz
    print(xyz.X)
    xyz.X = 50
    import test2
    

    相关文章

      网友评论

          本文标题:34.5-绝对导入、相对导入

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