Python进阶(八)----模块,import , from import 和 `__name__`的使用

Python进阶(八)----模块,import , from import 和 __name__的使用

一丶模块的初识

#### 什么是模块:
	# 模块就是一个py文件(这个模块存放很多相似的功能,函数的集合体)
    

### 模块的分类:
    # 内置模块: 标准库 ,python解释器自带的 ,200多种
    # 第三方库: 通过pip install 安装第三方库 6000个
    # 自己写的模块:  自己编写的特定功能的py文件
    
    
    #### 自定义模块:
        #   只是第一次引用时, 将此模块加载到内存,
        #   执行文件:   被引用文件

二丶模块的导入 import

 ### 语法 : import 模块名		 , 只加载一次(导入就不会再次加载)  
 ### 调用格式 : 模块名 . XX功能
 
 ### 引用模块发送三件事:
            #1. 把要引入模块加载到内存
            #2. 在内存中创建一个以引入模块命名的名称空间
            #3. 通过引入模块的名字,以.的方式引入此模块的(变量,函数,类名)

            
###注意:            
# 通过import引入的模块,引入模块中的变量不会受到,当前模块相同名字的变量的影响
# 通过import 引入的模块, 他有自己的独立空间,与当前执行的文件没有关系.



### 起别名:   import  ...模块  as  ...缩写名  
    # 将一个名字较长的模块名 简化成一个 简单名字
import  tbjx as k
print(k.name)


### 同时调用多个模块 ,以,号分隔 (不建议使用, 会使代码清晰,不易维护)
import 模块1, 模块2 ,模块3

三丶from import

### 语法格式: from  xxx模块  import 变量  , 只加载一次  
from tbjx import func1

print(globals())	# 查看当前文件中的变量, 把需要用的具体变量,从引入模块拷贝一份. 


### 特点:
 # 优点: 使用起来方便 (更容易快速找到指定的要使用的 功能 )
 # 缺点: 容易与当前执行文件产生覆盖效果(如果当前执行的文件中具有和导入的模块 相同名字的变量就会被覆盖.谁先加载,谁先被覆盖)


### 注意: (极端情况,一般没人这么折腾自己) 
# 需求: 在引入一个模块的之后,去执行这个模块的中修改模块的某个变量的值. 不会对当前执行文件造成影响. 

# 当前执行文件使用的是模块中同一个函数.(只有模块中的变量会被拷贝当前执行文件, 模块中的函数不会被拷贝) 
# 引用模块中的函数,如果此模块用到一些变量,这些变量还是从此模块中寻找,不会改变当前执行文件的变量




### 起别名  
 from tbjx import name as n


##多个导入:
 from  tbjx import  name as n
 from  tbjx import  read1 as r


###   *  (尽量别用)
from xxx模块  import *

# 全部复制(模块中所有的都被全部加载到内存中), 效率低, 容易覆盖
# from .. import * 与__all__配合使用
# 在引入模块的文件中,创建一个列表 __all__=[变量1,变量2,函数名1,函数名2]   一般写在引入模块最上面




#####推荐: 
	# 当前执行的文件中 ,不要出现 与 引入模块相同的名字的变量.

四丶模块路径 和 "__name__"的使用

### __name__ 的使用 ,判断当前文件是可执行的脚本,还是模块
# 1. py文件的第一个功能: 执行文件(承载代码)脚本(主动)  ,直接打印(__name___)得到__main__
# 2. py文件的第二个功能: 模块(被执行)      直接打印(__name___)得到 模块名


 # 补充:  
    #1.使用pycharm是,点击run 一个.py的文件,(文件包括👇下面的代码),就会打印True,此时的
      #   __name__==__main__ ,  so , 是一个主动执行脚本.
    
        if __name__ == '__main__':
    		print(True)
            
    #2. 而且下面的代码,还具有测试功能
    
        def func1():
            print('in func1')

        def func2():
            print('in func2')
            return '执行 func2'
        func1()
        func2()

        if __name__ == '__main__':
            ret=func2()
            print('测试func2:'+ret)


            
            
            
### 模块的搜索路径
	# 寻找模块的路径: 内存--->内置模块--->sys.path
	# 只要找到这三个地方:  内存中,内置中 ,sys.path可以找到这个引用的模块的路径,这个模块就直接引用


    
### 主动的将一个模块的路径添加到 当前工作sys.path环境
import sys
print(sys.path) # 打印当前工作目录
print(sys.modules) # 打印当前文件中所有的模块
sys.path.append(r'XXX文件')   # xxx文件 和 你当前执行文件的父目录同级 ,xxx文件包含 tbjx.py文件
import tbjx1
posted @ 2019-06-26 16:27  染指未来  阅读(400)  评论(0编辑  收藏  举报