zoukankan      html  css  js  c++  java
  • 模块(modue)和包(package)的概念-import导入模块

     

    模块

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

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

    使用模块有什么好处?

    最大的好处是大大提高了代码的可维护性。

    其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

    所以,模块一共三种:

    • python标准库
    • 第三方模块
    • 应用程序自定义模块

    另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

    包(package)

    通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。(如果__init__文件,python 2是不支持导入的,但是测试python 3支持)

    原来在python模块的每一个包中,都有一个__init__.py文件(这个文件定义了包的属性和方法)然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。当你将一个包作为模块导入(比如从 xml导入 dom )的时候,实际上导入了它的 __init__.py 文件。

    一个包是一个带有特殊文件 __init__.py 的目录。__init__.py 文件定义了包的属性和方法。其实它可以什么也不定义;可以只是一个空文件,但是必须存在。如果 __init__.py 不存在,这个目录就仅仅是一个目录,而不是一个包,它就不能被导入或者包含其它的模块和嵌套包。

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

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

    现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突

    列:

     

    有个abcd.py文件和 testa 同级目录

    导入包 testa的时候   实际上就是 在执行testa里面的 __init__.py 这个文件

     导入推荐写法:

    from testa import scla
    from testa.scla import show


     

    from testa.web1 import scla
    from testa.web1.scla import show
    from testa import web1 #执行__init__文件
    web1.scla.show(1) #以前的python老版本这样执行会报错 ;新版本支持了

     

     

     

     

     

     

    为什么在python 目录找不到time模块  sys模块等   是因为C语言实现的内置到解释器里面的

    import 是如何工作的:有如下2个文件

     

     

    test.py里面导入import scla文件的时候,会先执行一遍scla.py文件,然后吧scla.py文件的内容全部获取过来给scla(也就是import scla)

    执行结果:

     

    当导入一个模块时,解释器先在当前包中查找模块,若找不到,然后在内置的built-in模块中查找,找不到则按sys.path给定的路径找对应的模块文件(模块名.py)
    sys.path的初始值来自于以下地方:
        包含脚本当前的路径,当前路径
        PYTHONPATH
        默认安装路径
     

    sys.path路劲如下:可以看出来了第一搜索路径是当前目录

    ['D:\xxxx\testa', 'D:\Study', 'C:\Program Files (x86)\Python36-32\python36.zip', 'C:\Program Files (x86)\Python36-32\DLLs', 'C:\Program Files (x86)\Python36-32\lib', 'C:\Program Files (x86)\Python36-32', 'C:\Users\Think\AppData\Roaming\Python\Python36\site-packages', 'C:\Program Files (x86)\Python36-32\lib\site-packages', 'C:\Program Files (x86)\Python36-32\lib\site-packages\win32', 'C:\Program Files (x86)\Python36-32\lib\site-packages\win32\lib', 'C:\Program Files (x86)\Python36-32\lib\site-packages\Pythonwin', 'C:\Program Files\JetBrains\PyCharm 2018.1.1\helpers\pycharm_matplotlib_backend']

     

    importlib 使用

    结果:

  • 相关阅读:
    hdu2089 数位dp
    AIM Tech Round 3 (Div. 2)
    Codeforces Round #372 (Div. 2)
    src 小心得
    水平文字垂直居中
    点击验证码刷新(tp3.1)--超简单
    TP3.1 中URL和APP区别
    getField方法
    PHP截取中文无乱码函数——cutstr
    substr — 详解
  • 原文地址:https://www.cnblogs.com/ajaxa/p/9179102.html
Copyright © 2011-2022 走看看