模块简介

一、模块

1.什么事模块

模块:是一系列功能的集合体,而函数是某一功能的集合体,因此模块可以看成是一堆函数的集合体。一个py文件内部就可以放一堆函数,因此一个py文件就可以看成一个模块。

模块的三种来源:

1:内置(python解释器自带的)

2:第三方的(别人写的)

3:自定义的(自己写的)

模块的四种表现形式:

1:使用python编写的py文件

2:已被编译为共享库或DLL的C或C++扩展

3:内置模块,使用C编写并链接到python解释器的内置模块

4 :把一系列模块组织到一起的文件夹(文件下游一个_init_.py文件,该文件称之为包。)

2.为什么要用模块

1:用别人写好的模块(内置,第三方):典型的拿来主义,极大的提高了开发效率。

2:使用自己写的模块:将我们自己程序中用到的公共功能,写入一个python文件,然后程序的各部分组件可以通过导入的方式来引用自定义模块的功能。

3.如何使用模块

一般使用 import 和 from...import... 导入模块。

# mod.py 文件
print('from mod')

hobby = 'read'
def func1():
    print('from mod func1',hobby)
    
def func2():
    print('from mod func2')
    
def func3():
    global hobby
    hooby = 'run'

import 模块名

# run.py 文件
import mod  # 导入文件名时,不要加 py

hobby = 'play'

mod.func1() # ---> 需要引用模块功能时,需要  (模块名.模块文件中的名字) 使用 
mod.func2()
mod.func3()

print(hobby) # ---> 不使用 (模块名.模块文件中的名字),只会在自己名称空间去寻找所对应的值
# from mod
# from mod func1 read
# from mod func2
# play
  • import 首次导入模块发送了3件事:

1:执行模块文件。

2:运行模块文件中的代码,将产生的名字与值存放到当前模块的名称空间中。

3:在执行文件中产生一个指向被导入模块的名称空间的名字。

2:执行模块对应的文件

注意:多次导入不再执行模块文件,会沿用第一次导入的成果。

  • 当模块文件名过于复杂时
# 假设需要导入的模块 xxooaatt.py
import xxooaatt as x  # 导入模块名后加 as 加你认为方便使用时的名
# xxooaatt.模块文件中的名字 
# 现在只需要:
# x.模块文件中的名字
  • 导入多个模块
# 导入多个模块,用逗号隔开
import time,sys,os  # 不推荐使用

from 模块名 import 具体的功能

from mod import hobby
# 导入模块后,就类似于
# hobby = 'run' 提前定义过了

hobby = 'play'  # 覆盖
print(hobby)
# from mod
# play
  • from...import... 首次导入模块发生了3件事:

1:执行模块文件。

2:运行模块文件中的代码,将产生的名字与值存放到当前模块的名称空间中。

3:在当前执行文件的名称空间中拿到一个名字,该名字直接指向模块中的某一个名字,意味着可以不用加模块名这个前缀而直接使用。

  • 优点:不用加前缀,代码更加精简。
  • 缺点:不加前缀容易与当前执行文件中名称空间中的名字冲突。

import 和 from...import 的异同之处

相同点:

1:两者都会执行模块对应的文件,两者都会产生模块的名称空间。

2:两者调用功能时,需要跑到定义时寻找作用域关系,与调用位置无关。

不同点:

1:import 需要加前缀,from...import... 不需要加前缀。

_all_ 使用方法

# 在被导入的模块中使用,限制其导入功能的个数
__all__ = ['hobby'] # 只允许导入 honny 

__all__ = []
# 不添加内容,则默认可以导入全部

_name__使用方法_

当文件被当作执行文件执行的时候__name__打印的结果是__main__

二、包

包:里面有很多工具,供使用者调用

作为一个包的设计者来说:

  1.当模块的功能特别多的时候,应该份文件管理

  2.每个模块之间为了避免后期改名的问题,应该使用相对导入

站在包的开发者 如果使用绝对路径来管理自己的模块 那么它只需要永远以包的路径为基准

(*****)站在包的使用者 必须将包所在的的文件夹路径添加到system path环境变量中

python2 如果要导入包 包下面不许要有__init__.py文件,否则报错

python3如果要导入包 包下面没有__init__.py文件也不会报错

        - 夺命三问:
            1.什么是包?
                包是一个带有__init__.py的文件夹,包也可以被导入,
                并且可以一并导入包下的所有模块。

            2.为什么要使用包?
                包可以帮我们管理模块,在包中有一个__init__.py, 由它来帮我们管理模块。

            3.怎么使用包?
                - import 包.模块名
                    包.模块.名字

                - from 包 import 模块名

                - from 包.模块名 import 模块中的名字

            - 导入包时发生的事情:
                1.当包被导入时,会以包中的__init__.py来产生一个名称空间。
                2.然后执行__init__.py文件, 会将__init__.py中的所有名字添加到名称空间中。
                3.接着会将包下所有的模块的名字加载到__init__.py产生的名称空间中。
                4.导入的模块指向的名称空间其实就是__init__.py产生的名称空间中。
posted @ 2019-08-13 11:49  Jeff的技术栈  阅读(981)  评论(0编辑  收藏  举报
回顶部