一、认识模块

  1. 什么是模块?
    1. 模块本质是一些功能的集合体
    2. 创建的一个py文件就是一个模块
  2. 使用模块:
    1. 在使用模块的py文件中 通过  import 或者 from import导入模块
  3. 模块的优点:
    1. 可以从文件级别组织代码,使得同特性功能能统一管理。
    2. 可以使用系统或者第三方模块(拿来主义),来提高开发效率。
  4. 模块的四种存在方式:
    1. 使用python编写的.py文件(任意一个python文件都可以作为模块)
    2. 已被编译为共享库,或DLL的c或c++扩展
    3. 包的概念:一堆py文件的集合体
    4. 使用c编写,并且链接到python解释器的内置模块

二、导入模块(import导入 和  from...import 导入)

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
  1.   导入模块干了哪三件事?
    1. 编译执行模块中对应的py文件,形成对应的pyc文件
    2. 产生该模块自己的名称空间
    3. 在使用该模块的名称空间中产生一个名字(导入的模块名)
  2. 导入模块的时候起别名:
    1. 通过as关键字给模块起别名:模块一旦起别名,则原名称就不可以用了
    2. 好处:
      1. 可以简化模块的名称
      2. 可以统一功能,便于调用
# 1.可以简化模块名字
import mmmmmmmmmmmmmmmmmm3 as my_m3
print(my_m3.num)
# 2.可以统一功能
cmd = input('数据库选择 1:mysql | 2:oracle:')
if cmd == '1':
    import mysql as db
    # mysql.excuse()
else:
    import oracle as db
    # oracle.excuse()
db.excuse()
# -*- coding: utf-8 -*-


# 在import 后的名字才会在该文件的名称空间中产生
# from m4 import a  # 指名道姓的可以导入_开头的名字

# 通过* 导入: 可以将导入模块中的(除了下划线开头的)名字一并导入
from m4 import *  # 通常不建议导入*,当需要使用模块中绝大部分名字时才考虑使用*
print(a)
a()


a = 20  # 两个py文件中的名 a 存在都是合理的
# 但是import 后的

#
# 需求:内部已存在了_卡头的名字,还想被外界通过*导入
# 本质:导入*其实就是导入__all__列表中存放的索引名字,系统默认不会收入_开头的名字
# 我们可以通过__all__指名道姓导入_开头的文件

"""
from 模块名 import 名字1,名字2.。。。。
可以指名道姓导入模块中所有想导入的名字

from 模块名 import *
# 导入的是模块中的__all__这个列表
# 1.系统默认该列表不会收录_开头的名字
# 2、可以自定义__all__列表来规定外界通过*可以导入的名字

不建议直接导入*,容易出现变量重名。

"""

注:每一个模块在被导入的时候都会产生一个自己的全局名称空间,且互不影响。

  多次导入,只会编译执行模块一次,将其加载到内存中,之后都是直接对名字的引用。

三、自执行与模块被调用的区别:(__name__)

  1. 在python中文件自己执行的文件属于自执行模块,他与被调用的模块之间的本质却别在于:
    1. 在py文件作为模块被使用的时候,__name__为模块名。
    2. 在py文件自执行的时候,__name__为字符串'__main__'
print("共有逻辑")
if __name__ == '__main__':
    # 所有自执行的逻辑
    print("m6: 我是自执行的")
    a = 10  # 产生的是全局的名字
else:
    # 所有模块的逻辑
    print("m6: 我被导入执行的")
#  print(a)  # 会报错:走else就不可能走if,所以a压根没产生

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄