D14 模块 导入模块 开发目录规范

1.模块的简介

  1.什么是模块:   模块就是一系列功能的结合体

  2.模块的三种来源: (1) 内置模块:python解释器自带的 (2)第三方模块:别人写的  (3)自定义的:自己写的

  3.模块的四种表现形式:(1) 使用python编写的py文件

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

             (3) 把一系列模块组织到一起的文件夹

             (4) 使用C编写并连接到python解释器的内置模块

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

           (2) 使用自己写的模块(自定义的):当多个文件中都需要使用相同的方法的时候 可以将该公共的方法写到一个py文件中,其他的文件以模块的形式导过去直接调用即可

  5.模块的使用:一定要区分哪个是执行文件那个是被导入文件

2.import导入模块

  1:import 使用语法  imort + 模块名,使用模块里的名字或方法时需要 模块名.变量(函数),通常导入模块的句式会在文件开头

import os  # 导入内置os模块
print(os.path.dirname(__file__))  # 打印当前文件位置

创建a11.py文件

print('正在导入a11')
def
my_sort(iterable): res = [] for i in iterable: for y,j in enumerate(res): if i > j: res.insert(y,i) break else: res.append(i) return res name = '小明'

    

import a11  # 导入自定义a11模块,也就是a11.py文件
print(a11.my_sort([1,23,545,674,324,21]))  # 调用a11中的my_sort函数

   2.导入名字复杂的模块时候取别名:例:  将a11文件名改为ttttttttttttttttttt.py

import ttttttttttttttttttt as f # 导入自定义ttttttttttttttttttt模块并通过as起一个简单的别名
print(f.name)  # 可以通过别名来使用模块,相当于ttttttttttttttttttt.name

  3.导入模块时内部的步骤: 在run.py程序中导入a11模块

  1. 右键运行run.py文件首先会创建一个run.py的名称空间
  2. 在第一次导入模块时 会先执行a11.py文件
  3. 运行a11.py文件中的代码将产生的名字与值存放到a11.py名称空间中
  4. run.py文件产生一个指向a11.py名称空间的名称空间

  4.注意:多次导入不会再执行模块文件,会沿用第一次导入的成果,也就是只有第一导入会执行模块里面的代码

  5.import特点: 指名道姓的访问模块中的名字,永远不会与执行文件中的名字冲突

3.from...import...导入模块

  1:方法:

from a11 import my_sort   # 只导入a11模块的my_sort方法
print(my_sort([1,24,5,67,344,22]))  # 使用时不需要通过模块名.名字方法访问,
print(name)  # name没有导入所以不能使用.会报错

 

from a11 import *   # 导入a11模块中的所有方法,不推荐使用
print(my_sort([1,24,5,67,344,22]))  # 使用时不需要通过模块名.名字方法访问,
print(name)  # 可以使用

  2.名字冲突

from a11 import name   # 只导入a11模块的my_sort方法
name = 'xiaohong'
print(name)  # xiaohong  由于在内部又定义了一个变量name,将指向导入模块中name的指针重新指向新定义的name

  3.导入模块时内部的步骤: 在run.py程序中导入a11模块

  1. 右键运行run.py文件首先会创建一个run.py的名称空间
  2. 在第一次导入模块时 会先执行a11.py文件
  3. 运行a11.py文件中的代码将产生的名字与值存放到a11.py名称空间中
  4. 直接拿到指向模块a11.py名称空间中某个值的名字

  4.特点:访问模块中的名字不需要加模块名前缀,但可能会与当前执行文件中的名字冲突

  5.__all__ 方法:可以限制导入者拿到名字的个数

4.循环导入模块:

  1: 如果在导入模块出现循环导入问题一定时程序设计不合理,循环导入问题应该在程序设计阶段就避免

  2解决方法:

    (1) 将循环导入语句的句子卸载文件的最下方

    (2) 在函数内部导入模块

5.__name__的用法:

  1:__name__:(1): 当文件被当做执行文件执行的时候__name__打印的结果是__main__

        (2): 当文件被当做模块导入的时候__name__打印的结果是模块名(没有后缀)

  2 :当我们在写完功能后测试的代码不希望被导入时执行时可以使用__name__方法判断

print('正在导入a11')
def my_sort(iterable):
    res = []
    for i in iterable:
        for y,j in enumerate(res):
            if i > j:
                res.insert(y,i)
                break
        else:
            res.append(i)
    return res
name = '小明'

if __name__ == "__main__":  # 快捷键 main 加tab
    print(my_sort([1,223,332,4,24,6]))  

6.模块的查找顺序  (py文件名不应该于模块名冲突)

  1:先从内存中找

  2:内置中找

  3: path中找   

7.绝对导入与相对导入

  绝对导入: 必须依据执行文件所在的文件夹路径为基准,无论在执行文件还时被导入文件中都适用

  相对导入: 不能在执行文件中使用,  .代表当前路径  .. 代表上一级路径  ...代表上上级路径

8.开发目录规范:

  1. bin  存放的是启动文件 (start.py)    通常放在项目根目录或bin文件夹

  2. conf 存放一些常量,配置信息 (settings.py)

  3. core 存放整个项目的核心逻辑 (src.py)

  4.db      数据库相关 (userinfo.txt)

  5. lib     存放一些公用方法(common.py)

  6.log     存放日志(操作记录)  (talk.log)

  7.Readme.txt   使用说明

  

  8 start.py文件内容

import os  # 导入os模块
import sys  # 导入sys模块
BASE_DIR = os.path.dirname(os.path.dirname(__file__))  # 获取软件安装的目录路径(当start.py在bin目录下)
# BASE_DIR = os.path.dirname(__file__)   # 当start.py在项目根目录下
sys.path.append(BASE_DIR)  # 将用户安装路径添加到path中
from core import src  # 从core文件夹导入src模块

if __name__ == '__main__':
    src.run()  # 执行启动文件