zoukankan      html  css  js  c++  java
  • python模块与包

    模块与包

    模块

    之前说过使用函数能够实现代码的可重用,但是是在同一文件内的调用。随着程序代码越写越多,在一个文件中代码会越来越长,越来越不容易维护。为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,维护也更方便。

    在Python中,一个.py文件就称之为一个模块(Module)。
    Python中模块分为三种: Python标准库,第三方模块,应用程序自定义模块

    使用模块可以帮助避免函数与其他模块函数重名,函数名与变量名重名的问题。此外,要尽量避免定义的模块名与内置函数(build in function)重名。

    模块导入方法

    import语句

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

    当使用import语句时,python会首先去内置模块里搜索模块,如果没有搜索到就会到python的模块搜索路径里去搜索,这个路径的列表可以通过sys.path查看。所以我们在导入非内置模块时不要在当前目录下命名与之同名的py文件,这会导致你导入的就是当前目录下的py文件。

    import模块时解释器做了哪些事

    执行文件执行import时:

    • 创建新的命名空间,通过该命名空间就可以访问导入模块的属性和方法

    • 在新建的命名空间中执行模块的代码

    • 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量

    总结起来就是遇到import语句就会执行模块文件的代码,可以通过模块名访问这个模块中的函数和变量。不过多次导入同一模块时,只有第一次导入会执行源文件内的代码,原因是:第一次导入就会将模块包含的内容统统加载到内存了,以后在当前文件位置的导入都是指向内存中已有的模块。

    示例
    导入模块并引用

    >>> import time
    >>> print (time)
    <module 'time' (built-in)>
    >>> time.time()
    1498650686.3658507
    >>> time.strftime('%Y-%m-%d %X')
    '2017-06-28 19:52:08'
    

    导入模块,为模块起别名

    >>> import math as mh
    >>> mh.sqrt(4)
    2.0
    

    from...import语句

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

    同样,遇到import就会执行模块中代码,不过这个声明不会把整个
    modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

    其中, from…import* 语句提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

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

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

    引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。

    导入包:
    无论是import形式还是from...import,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法,点的左边都必须是一个包,否则非法。可以带有一连串的点,如item.subitem.subsubitem,但都必须遵循这个原则。
    包的本质就是一个包含__init__.py文件的目录。

    无论使用import还是from import,只要是第一次导入包或者是包的
    任何其他部分,都会依次执行包下的__init__.py文件。
    

    __name__

    在python中经常会看到
    if __name__=='__main__':
    main() #main()函数或者其它语句

    这个语句的作用就是当你在这个代码文件里执行时__name__就是等于
    '__main__'这个字符串的,而当这个代码文件作为模块被导入到其它文件时,它的__name__等于导入模块的模块名,这时这个判断就不成立,就不会执行main()函数。也就是说作为模块导入时只导入main()代码的定义,不会执行。所以以后开发建议用这种方式执行函数。

    使用这个语句能够便于调试代码。即一个模块被调用的时候不执行内容,而自己调试模块的时候可以顺利的执行模块内容。

  • 相关阅读:
    Java 对文件的操作
    快速排序算法
    Java 时间和字符换的处理
    Redis 数据结构之Keys
    [转] Redis系统性介绍
    【转】JAVA 接口
    [转] Python 代码性能优化技巧
    几道关于面试的题目
    随手笔记2
    随手笔记
  • 原文地址:https://www.cnblogs.com/liao-lin/p/7091968.html
Copyright © 2011-2022 走看看