• python学习笔记之---模块、包


    模块:实际是一个py文件
    包:指目录,目录里面包含__init__.py,内容可以是空,里面还可以包含其他的py文件。
    子包:包里面再创建的包

    模块的导入


    我们写代码的时候,实际上可以把所有的代码都包含在一个文件里面。
    需要把一个很大的文件,拆分为不同的模块或者包,以此来实现代码的可维护性
    模块和包,可以很方便的提供给其他程序以复用。在构建工程的时候,还可以基于模块和包来进行开发人员的任务分配工作。
     
    import:导入一个整体的模块
    from:从一个模块中获取一些特定的内容
    reload:在不终止python程序的情况下,重新导入模块文件内容的方法。
     
     
    a.py
    import b
     
    print(b.x)
    b.print_sth()
    y=b.Person()
    print(y)
    b.py
    x=100
     
    def print_sth():
        print("gloryroad!")
     
    class Person(object):
        pass
    注意:a.py和b.py要在同一个目录下
    执行结果:
    C:Usersdell>py -3 D:pythona.py
    100
    gloryroad!
    <b.Person object at 0x000002187C186B70>
     
     
     
    b.py
    x=100
     
    def print_sth():
        print("gloryroad!")
     
    class Person(object):
        pass
     
    print("hi!")

    执行结果:

    C:Usersdell>py -3 D:pythona.py
    hi!
    100
    gloryroad!
    <b.Person object at 0x000001EDAA3B6B70>
    结论:b.py中所有的内容在导入的时候都会被执行,所以执行a.py时hi!也被输出了
    如果不想让打印语句(测试代码)在a中执行时要写的if __name__ == "__main__"里
     
    b.py
    x=100
     
    def print_sth():
        print("gloryroad!")
     
    class Person(object):
        pass
     
        #此语句表示,当本文件被当做程序执行的时候
        #才会执行此语句下面的代码。
        #如果本文件被其他文件import,那么if代码块
        #则不会被执行
    if __name__ == "__main__":  
        print("hi!元宵节快乐!")

    执行结果:

    C:Usersdell>py -3 D:pythona.py
    100
    gloryroad!
    <b.Person object at 0x000001E082516B70>
    结果:在执行a.py的时候if里面的语句没有被执行
     
     
    引入模块的两种写法:
    一 、import xxx   这种写法a.py想要使用b.py中的函数/方法/变量时前面需要加模块的名字(b.XXX),写法比较麻烦
    二、 from xxx  import a,b,c(按变量或函数来引入)  / from xxx import *(如果b.py中函数,变量等太多可以用*,*表示引入所有,但容易冲突)
    示例:
    a.py
    from b import x,print_sth,Person
     
    print(x)
    print_sth()
    y=Person()
    print(y)
    #b.py实际上是一个python文件,它是一个模块;模块给其他程序文件提供公用的变量、函数和类
    #a.py实际上是主程序,引用b模块(b.py)来做一些事情
     
     
    命名冲突:a,b都存在xx
    a.py
    from b import *
    xx=123
     
    print(xx)
    print(b.xx)#这样写会报错
    b.py
    xx=100
    运行结果:#报错,b未定义
    D:pic est2>py -3 a.py
    123
    Traceback (most recent call last):
      File "a.py", line 5, in <module>
        print(b.xx)
    NameError: name 'b' is not defined
     
    修改a.py
    from b import *
    import b
    xx=123
     
     
    print(xx)
    print(b.xx)
    执行结果:
    D:pic est2>py -3 a.py
    123
    100
     
     
    命名空间:
    a.py和a.py中有相同的变量(冲突)
    a.py的命名空间:
    xx
     
    b.py的命名空间:
    x
    print_sth
    Person
    xx
     
    import b
    我把b的命名空间引入到了a.py文件
    b.x
    b.print_sth
    b.Person
    优点:a和b的命名空间的内容不会冲突
    因为b.xxxx肯定不会和a文件中的变量、函数和类的命名相冲突
     
     
    from b import *
    把b的命名空间引入到了a.py文件,并且使用的时候无须加上b.
    x
    print_sth
    Person
     
    优点:省去写b.
    缺点:容易产生冲突
    例如:
    b.py包含xx
    a.py也包含xx
    则此时a.py中print(xx),会使用a.py中的xx值。
     
    实例:
    a.py
    from b import *
    import b
     
    xx=123
    print(xx)
    print(b.xx)
    b.py
    x=100
     
    def print_sth():
        print("gloryroad!")
     
    class Person(object):
        pass
     
    xx=1000
    if __name__ == "__main__":  
        print("hi!元宵节快乐!")

    执行结果:

    C:Usersdell>py -3 D:pythona.py
    123
    1000
     
     
    包的导入

    包:包含目录---目录下要包含模块和__init__.py
    包下面可以包含多个模块,还可以包含子包
     
    创建一个D:packagea的包
    #包和a.py必须在同级目录
    a.py
    import packagea.c
     
    print(packagea.c.yy)
    packagea.c.p()
    g=packagea.c.P()
    print(g)
     
    c.py
    yy=123
     
    def p():
        print("hello!")
     
    class P(object):
        pass

    运行结果:

    C:Usersdell>py -3 D:pythona.py
    123
    hello!
    <packagea.c.P object at 0x000001F044236B70>
     
     
     
    另一种导入包下面的模块的写法:
    a.py
    from packagea.c import *
     
    print(yy)
    p()
    g=P()
    print(g)

    运行结果:

    C:Usersdell>py -3 D:pythona.py
    123
    hello!
    <packagea.c.P object at 0x0000021D5B786B70>
     
     
     
    创建子包:D:packageasubpackage
    子包下创建一个:d.py文件
    a.py
    #第一种导入的写法
    from packagea.subpackage.d import *
     
    print(mm)
    
    #第二种导入的写法
    import packagea.subpackage.d
     
    print(packagea.subpackage.d.mm)
    d.py
    mm=125

    运行结果:

    C:Usersdell>py -3 D:pythona.py
    125
     
     
     
    #不在同一级目录时
    #方法1:主程序和依赖的包或依赖的模块在同一级。
    #方法2:只是程序执行时候有效
    #import sys
    #print(sys.path)
    #sys.path.append(包的绝对路径或者模块的绝对路径)
    #方法3:
    #通过我的电脑的设置,把将包或者模块的路径加到pythonpath变量下
    #需要重启cmd
    #方法4:
    将包或者模块直接放到C:Python36Libsite-packages目录下即可
     
    a.py
    import sys
    sys.path.append(r"D:packageasubpackage")
     
    from packagea.subpackage.d import *
     
    print(mm)
     
  • 相关阅读:
    racket eval
    mex不兼容
    【转】雷军 程序员随想
    UBoot 目录结构和编译过程
    远程监控web开发
    STL容器[08]
    STL容器[07]
    STL容器[17]
    STL容器[06]
    stl.map使用总结
  • 原文地址:https://www.cnblogs.com/wenm1128/p/11657391.html
Copyright © 2020-2023  润新知