美文网首页
Python2.7 模块和包管理学习小结 04

Python2.7 模块和包管理学习小结 04

作者: JMasche | 来源:发表于2017-01-24 17:07 被阅读20次

    根据例子逐个分析

    导入下一层目录中的文件

    1. 见上篇
    2. 见上篇
    3. 见上篇
    4. 见上篇
    5. 见上篇
    6. 通过init.py来载入模块
      根据4、5两个例子的运行结果,我们可以观察到只要载入某个目录,必然会先载入其目录下的__init__.py并且运行。
      所以我们尝试可以在每层目录的__init__.py配置需要的导入,这样可能会在顶层导入时变得简单。

    6.1 在effects__init__.py载入echo,代码如下:
    effects.init.py:

    # 导入echo
    import echo
    # __init__.py原始代码
    print "============== effects.__init__ =============="
    print dir()
    

    test_main.py:

    # 导入echo
    import effects
    effects.echo.test()
    # test_mian.py原始内容
    print "============== test_main.py =============="
    print dir()
    def test():
            print "============== test_main.test =============="
    # main()
    if __name__ == '__main__':
            test()
    

    运行结果:

    ============== echo.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
    ============== effects.__init__ ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo']
    ============== echo.test ==============
    ============== test_main.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
    ============== test_main.test ==============
    [Finished in 0.3s]
    
    6.2 我们尝试在`test_main.py`中调用第三层目录`third`的`third1.py`中的函数。
    

    首先,在third目录的__init__.pyimport third1,代码如下:

    # 导入third1
    import third1
    # __init__.py原始代码
    print "============== third.__init__ =============="
    print dir()
    

    其次,在effects目录的__init__.pyimport third,代码如下:

    # 导入echo
    import echo
    # 导入third
    import third
    # __init__.py原始代码
    print "============== effects.__init__ =============="
    print dir()
    

    最后,我们可以直接import effects之后,通过effects.third.third1.test()test_main.py中完成调用:

    # 导入
    import effects
    effects.third.third1.test()
    # test_mian.py原始内容
    print "============== test_main.py =============="
    print dir()
    def test():
        print "============== test_main.test =============="
    # main()
    if __name__ == '__main__':
        test()
    

    运行结果:

    ============== echo.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
    ============== third1.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
    ============== third.__init__ ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'third1']
    ============== effects.__init__ ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'third']
    ============== chird1.test ==============
    ============== test_main.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
    ============== test_main.test ==============
    [Finished in 0.2s]
    
    6.3 **如果我们在`_init__.py`中用`from m import f`的方式载入到函数,调用时会如何?**
    

    effects.init.py:

    # 导入
    from echo import *
    # __init__.py原始代码
    print "============== effects.__init__ =============="
    print dir()
    

    test_main.py: 我们先只导入effects,并不尝试调用

    # 导入
    import effects
    # test_mian.py原始内容
    print "============== test_main.py =============="
    print dir()
    def test():
        print "============== test_main.test =============="
    # main()
    if __name__ == '__main__':
        test()
    

    运行结果:

    ============== echo.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
    ============== effects.__init__ ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'test', 'test1']
    ============== test_main.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
    ============== test_main.test ==============
    [Finished in 0.2s]
    

    我们发现,test_main.py仅仅含有effects,而effects.__init__包含有echo, test, test1
    所以,我们可以通过两种调用方式达到目的:effects.echo.test()effects.test()。运行结果如下:

    ============== echo.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__']
    ============== effects.__init__ ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'echo', 'test', 'test1']
    ============== echo.test ==============
    ============== test_main.py ==============
    ['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'effects']
    ============== test_main.test ==============
    [Finished in 0.2s]
    

    注意:effects.test()这种方式,需要注意在effects.__init__的名字冲突问题

    “导入下一层目录中的文件”小结
    1、可以通过import x1.x2.y1方式导入,这样调用函数的方法是x1.x2.y1.z1()
    2、可以通过from x1.x2 import y1方式导入,这样调用函数的方法是y1.z1()
    3、可以通过配置每一层目录的__init__.py,然后在上一层目录文件中调用相关函数。
    例如:x2目录的__init__.py写上import y1;就可以在x1目录的模块中import x2,然后'x2.y1.z1()'来调用函数。
    同样:x2目录的__init__.py写上from y1 import z1;就可以在x1目录的模块中import x2,然后'x2.y1.z1()'或者x2.z1()来调用函数。

    相关文章

      网友评论

          本文标题:Python2.7 模块和包管理学习小结 04

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