• Python-包


    具体的:包就是一个包含有__init__.py文件的文件夹,所以其实我们创建包的目的就是为了用文件夹将文件/模块组织起来

    创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

    import时导入者不关心是文件夹还是.py;他只知道这是模块。

    import aaa  此处导入的是__init__.py,产生名称空间也是__init__.py的,而且执行的是__init__.py的源代码

    __init__.py增加变量代码:

    执行文件test:

    import aaa
    
    print(aaa.x)
    print(aaa.y)
    
    结果是打印init里变量的值

    也就是说:导入包实际上就是在导入包下面的__init__.py文件

    另,import a.b.c.d    导入包才有的语法,点的左边都是包才行

    环境变量就是执行文件的环境变量,固定不变的。

    # test.py(执行文件)中
    
    import sys
    print(sys.path)
    
    import aaa
    
    # __init__.py中
    import sys
    print(sys.path)
    
    # 得到的结果两个环境变量值都是一样的,都是执行文件的环境变量

    所以在__init__.py中导入m1报错,因为m1没有在执行文件的环境变量里

    如果要在执行文件里拿到m1,所以就要在__init__.py中添加:from aaa import m1  才能让test文件找到m1

    # __init__.py中添加
    
    from aaa.m1 import f1
    from aaa.m2 import f2
    # m1左边一定是个包,而且from...import后面是一个明确的名字,不能再加.

    test.py中aaa.f1() aaa.f2()执行结果:

    from  f1
    from  f2
    
    #因为m1/m2里面函数f1/f2的代码就是print('from f1')/print('from f2')

    aaa下面有加一层bbb,test.py中加入如下代码

    import aaa
    aaa.bbb
    
    # 报错

    要在aaa里的init中添加from aaa import bbb才行

    所以bbb下面的__init__.py就代表了bbb这个包

    所以在test.py中可以执行aaa.bbb.x  结果,就是bbb下面的__init__.py里x变量的值;

    再来:

    bbb下面init添加

    from aaa.bbb import m3
    
    # 在test就可以用到m3    aaa.bbb.m3
    # 在test也就可以直接操作m3里的f3函数    aaa.bbb.m3.f3     直接打印f3内容

    那可以直接aaa.f1()吗?

    # 需要去aaa下面的init中添加:
    
    from aaa.bbb.m3 import f3

    也就是说

    # test中
    
    import aaa
    
    aaa.f1()
    aaa.f2()
    aaa.f3()
    
    # 与test在同一目录的aaa下的init中
    from aaa.m1 import f1
    from aaa.m2 import f2
    from aaa.bbb.m3 import f3
    
    test执行没问题
    #相对目录表示法:
    
    from .m1 import f1
    from .m2 import f2
    from .bbb.m3 import f3
    
    # .代表当前目录,下面也有讲。

    新场景,模块的开发者在一个模块中使用自己的另一个模块

    # m3.py中
    from aaa.ccc.m4 import f4
    def f3():
        print('f3')
        f4()

    以上是绝对路径,相对路径如下:

    from ..ccc.m4 import f4
    def f3():
        print('f3')
        f4()
    
    # .本目录bbb,..上级目录aaa
    # 一个.就代表从当前目录找,两个.就是从上一级目录找
    # .bbb.m3 两个点意义不一样。后面的是“子”的意思

    如果aaa被放进了一个xxx/yyy的目录下,test该怎么找到它呢?

    # test中添加新的环境变量
    
    import sys
    sys.path.append(r'C:UsersAdministratorPycharmProjectspython19期day57 包的使用xxxyyy')
    
    import aaa
    
    aaa.f1()
    aaa.f2()
    aaa.f3()
    
    # 即可!

    也可以在test文件添加,除非你对包内部很熟悉

    from aaa.ccc.m4 import f4
    f4()
    
    import aaa.ccc.m4
    aaa.ccc.m4.f4()
    
    # 这个找的过程会触发每个文件下面的init,但这里没有依赖它
    
    不能继续.f4了,import aaa.ccc.m4.f4   因为f4左边不是包啦

    作者:大雄猫
    出处:http://www.cnblogs.com/guoxiangqian/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面 明显位M给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    C++函数模板的显示调用与隐式调用
    git显示颜色配置
    STL容器元素应满足的条件
    vector缩减容量
    PAT (Basic Level) Practise:1036. 跟奥巴马一起编程
    Core Java Volume I — 4.10. Class Design Hints
    Core Java Volume I — 4.7. Packages
    蓝牙(Profile)构成
    Android开发之Java必备基础
    主机控制器接口(HCI)
  • 原文地址:https://www.cnblogs.com/guoxiangqian/p/7697727.html
Copyright © 2020-2023  润新知