• 从零开始的Python学习Episode 16——模块


    一、模块

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

    为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)

    模块导入的方法

    1.import 

    import module1[, module2[,... moduleN]

    这种方法在使用模块中的函数的时候需要在前面加上它所属的模块,像这样

    import fun
    fun.tools()

    否则无法正确调用模块中的函数。

    2.from…import

    from modname import name1[, name2[, ... nameN]]

    这种方法不会将整个模块中的内容导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

    3 .From…import* 

    导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用

    这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

    这些方法的运行本质则是先通过sys.path找到模块,然后执行模块的脚本(全部执行,即将模块中的所有语句执行一遍),区别是方法1会将模块的变量名加载到名字空间,而2只会将name1这个变量名加载进来。

    二、包

    如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

    举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

    现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:

                             

    引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,view.py模块的名字就变成了hello_django.app01.views,类似的,manage.py的模块名则是hello_django.manage。

    请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

    调用包就是执行包下的__init__.py文件

    注意:

    1 from tools import show
    2 show()

    这样使用的时候,在PyCharm上运行不会出错原因是PyCharm将mod这一层的路径加入到了sys.path中,但是如果程序不在PyCharm中运行的时候则会报错。

    解决方法:手动将路径加到sys.path中

    from tools import show
    import sys,os
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    #找到mod这一层的路径
    sys.path.append(BASE_DIR)
    show()

    1.__name__

    如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

    这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

  • 相关阅读:
    调用系统api修改系统时间
    格式化为货币
    select的使用(二)
    select的使用(一)
    保留n位四舍五入小数
    加密解密,CryptoStream()的使用
    从字符串总分离文件路径、命名、扩展名,Substring(),LastIndexOf()的使用;替换某一类字符串,Replace()的用法
    根据标点符号分行,StringBuilder的使用;将字符串的每个字符颠倒输出,Reverse的使用
    将汉字转化为拼音,正则表达式和得到汉字的Unicode编码
    unicode编码、字符的转换和得到汉字的区位码
  • 原文地址:https://www.cnblogs.com/smilepup-hhr/p/10338731.html
Copyright © 2020-2023  润新知