zoukankan      html  css  js  c++  java
  • __init__.py的作用--转载

    __init.py__的作用是简化导入语句。

    1 没有__init__.py时导入函数
    我们先来看看没有__init.py__时是怎么导入模块和函数的。假设我的目录结构如下:

    .  # main.py所在目录
    |- main.py

    |- my_module1.py
      |- my_function1()  # my_module.py中的一个函数

    |- my_package  # my_package是一个文件夹
      |- my_module2.py
        |- my_function2()

    想要在main.py中调用my_function1()和my_function2(),可以输入下面语句进行导入:

    import my_module1
    from my_package import my_module2

    ### 调用my_function1()和my_function2()
    my_module1.my_function1()
    my_module2.my_function2()
    1
    2
    3
    4
    5
    6

    from my_module1 import my_function1
    from my_package.my_module2 import my_function2

    my_function1()
    my_function2()
    1
    2
    3
    4
    5
    可以看到,没有__init.py__时,导入其他模块的函数,需要一层层地去找,所以导入语句长度也与文件夹层数成正比。

    2 有__init__.py时导入函数
    为了调用my_function2(),需要从my_module2中导入,而my_module2又在my_package文件夹中,于是就有了上面的导入语句:

    from my_package.my_module2 import my_function2
    1
    假如my_package中my_function2,那我们就不用逐层深入地去找了,就可以用下面的语句导入了:

    from my_package import my_function2
    1
    而__init__.py就能实现这个功能。
    当我们导入my_package时,python会先看下这个文件夹下有没有__init__.py这个文件,如果有,就先执行这个文件,相当于初始化my_package,跟类(Class)首个方法__init__()作用差不多,都是初始化。于是乎,我们可以在刚导入my_package这个模块时,初始化加载my_function2到my_package中,在main.py里,我们就能用上面的语句导入my_function2了。
    __init__.py的内容可以这样编写:

    from .my_module2 import my_function2
    1
    现在,我们my_package文件夹里多了个__init__.py,目录结构如下:
    .  # main.py所在目录
    |- main.py

    |- my_module1.py
      |- my_function1()  # my_module.py中的一个函数

    |- my_package  # my_package是一个文件夹
      |- __init__.py  # 内容如上
      |- my_module2.py
        |- my_function2()
    我们可以测试一下,把main.py的内容改成下面这样:

    import my_package

    print(dir(my_package))
    1
    2
    3
    在打印的内容里,我们看到了’my_function2’,说明my_function2已经加载到my_package里了,这样,我们在main.py里就可以直接从my_package导入my_function2了,如下:

    from my_package import my_function2
    1
    3 __init__.py中的点(.)
    我刚看__init__.py内容就觉得很奇怪,为什么my_module2前面要加个点(.)呢,不加点会怎样呢?
    不加点的话,会报错:没有my_module2这个模块。
    那是因为,我们运行的是main.py,当前工作目录就在main.py所在的目录,不加点的话,__init__.py就会从当前工作目录中找模块my_module2,这当然找不到,因为my_module2在my_package文件夹下。所以__init__.py的导入一般都会带上点(.),表示从__init__.py的目录下导入模块。想要亲身实践的同学,可以在__init__.py中加入:

    import os

    print(os.getcwd())
    1
    2
    3
    这就是我对__init__.py的一点粗浅的理解,不过对我来说目前了解到这程度也够了,希望能帮助到有同样疑问的人。
    ————————————————
    版权声明:本文为CSDN博主「cgyx008」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/cgyx008/article/details/99710504

  • 相关阅读:
    图书馆管理系统

    有理数类的设计
    题目4-多关键字排序(基于自定义比较函数)
    图总结
    树、二叉树、查找算法总结
    数据结构小结
    C语言文件
    第二次博客作业
    第一次博客作业
  • 原文地址:https://www.cnblogs.com/lnn123/p/12355617.html
Copyright © 2011-2022 走看看