zoukankan      html  css  js  c++  java
  • Python知识点记录二(包和模块)

    包和模块

    1、Python项目的组织结构

    Python最顶级的层级是包,模块即是包下的各个python文件。从组织的层面考虑,模块应该为各种功能“类”。

    2、包和文件夹的不同

    *包在形式上就是一个文件夹,但作为包,包内必须含有一个“__init__.py”模块,同时这个“__init__.py”在Python解释器运行时其名字就是包名。

    *当一个包被导入,或者该包内的某个模块,或者该包下某个模块内的变量/函数被导入的时候,包内的__init__模块会被解释器自动运行。

    *在包内的__init__.py内可以通过定义__all__ = ['包内模块名'的字符串列表],设置包内哪些模块可以被外部导入。

    3、import、from/import的用法

    *对于直接使用import的导入方法,import后面只能跟模块名,不能直接导入模块内的变量或函数等!

    *可以通过from/import的方式直接导入模块内的变量或函数等。如包test下的模块x中的变量m可以用以下方式导入使用:

    import test.x
    print(test.x.m)
    
    from test.x import m
    print(m)
    
    from test import x
    print(x.m)

    *如果要导入包test下模块x中的所有变量、函数;那么可以用:from test import *   。但不推荐这种方法,这会使得导入不够明确。

    如果要导入模块x中的部分变量,则可以在模块x中通过设置__all__=[可导入变量/函数名组成的字符串列表]

    __all__ = ['a','c']  
    a = 2
    c = 3
    d = 5  #d不在_all_列表中,所以无法导入其他模块中使用

    或者直接:from test import a,c

    4、模块内置函数

    任意模块的内置函数可以通过dir()方法显示。

    #模块
    a = 1
    print(dir())
    #打印出上述模块的内置变量
    #其中可以发现变量a为自定义的变量,其余为系统自带的变量
    ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']

    (1)__name__:当前的模块名称。当该模块本身为入口模块时,名称会变成'__main__'。

    (2)__package__:当前模块所属的包名,当模块为入口模块时,则不存在其上层的顶级包,则返回None。

    (3)__doc__:当前模块的文档注释,如果模块没有文档注释,则返回None。

    (4)__file__:当前模块的路径信息。

    #t.t1.c9
    '''This is T-t1-c9'''
    print('t-t1-c9-NAME:'+__name__)
    print('t-t1-c9-PACKAGE:'+(__package__ or '当前模块不属于任何包'))
    print('t-t1-c9-DOC:'+(__doc__ or '当前模块没有文档注释'))
    print('t-t1-c9-FILE:'+__file__)
    
    #t.c15
    import t.t1.c9
    
    print('t-c15-NAME:'+__name__)
    print('t-c15-PACKAGE:'+(__package__ or '当前模块不属于任何包'))
    print('t-c15-DOC:'+(__doc__ or '当前模块没有文档注释'))
    print('t-c15-FILE:'+__file__)
    
    #运行c15的结果:
    '''
    This is __init__.py file of PACKAGE t.
    t-t1-c9-NAME:t.t1.c9
    t-t1-c9-PACKAGE:t.t1
    t-t1-c9-DOC:This is T-t1-c9
    t-t1-c9-FILE:D:...seven		1c9.py
    t-c15-NAME:__main__
    t-c15-PACKAGE:当前模块不属于任何包
    t-c15-DOC:当前模块没有文档注释
    t-c15-FILE:D:...sevenc15.py

    5、__name__变量的经典应用

    #Make a script both importable or excutable
    #使得一个模块既可以作为普通模块也可以作为可执行程序
    if __name__ == '__main__':
        pass
     
    #c17
    
    if __name__ == '__main__':
        print('This is app.')
    
    print('This is a module.')
     
    #c16
    
    import c17
    
    print('test')
    
    #运行c16的结果:
    This is a module.
    test
    
    
    #运行c17的结果:
    This is app.
    This is a module.

    6、相对导入和绝对导入

    任意模块其所属的顶级包,都和当前入口程序相关,模块的顶级包最多只上升到入口程序的平级层次。

    入口程序不属于任意包。

    如果有一个python项目,其包括main.py和package1、package2、package3;其中package2包中又有package4包,package4包内有模块m2.py。

    如果以main.py作为入口文件,其中需要导入m2模块,则:

    #main.py
    #这里的“package2.package4.m2”即为绝对导入
    import package2.package4.m2

    对于相对导入:一个点'.'表示当前目录,两个点'..'表示当前目录上一层目录,三个点'...'表示当前目录上上层目录,以此类推。

    在入口程序中不能使用相对导入,因为相对路径能找到对应模块是在于其会通过所在模块的'__name__'来定位;而对于入口文件,其__name__会被改成'__main__',在目录中是找不到'__main__'这个文件的。

    import导入语法也不能使用相对导入,只能在from/import中使用。

    #绝对导入一定是从顶级包开始
    import package2.package4.m2
    
    #相对导入
    #导入该模块同级目录下m3模块的变量a
    from .m3 import a
    
    #导入该模块统计目录下package5包下m3包下的变量a
    from .package5.m3 import a
    
    #导入该模块同级目录下package5包下的m3模块
    from .package5 import m3
    
    #导入该模块上级目录下m4模块内的p变量
    from ..m4 import p
  • 相关阅读:
    [HAOI2018]苹果树
    [TJOI2013]拯救小矮人
    [SDOI2016]硬币游戏
    一辈子都学不会的有上下界的网络流
    [AHOI2014/JSOI2014]支线剧情
    [JSOI2009]球队收益
    hdu-1856 More is better---带权并查集
    hdu-1325 Is It A Tree?---并查集
    hdu-1272 小希的迷宫---并查集或者DFS
    hdu1213-How Many Tables---基础并查集
  • 原文地址:https://www.cnblogs.com/tsembrace/p/8735135.html
Copyright © 2011-2022 走看看