模块

一.模块初识

什么是模块:

  模块:就是一系列功能的集合
    模块的三种来源:
    1.内置模块(python解释器自带)
    2.第三方模块
    3.自定义模块


  模块的四种表现形式
    1.使用python编写的py文件(一个py文件也可以称为一个模块)
    2.已被编译为共享库或DLL的C或C++扩展
    3.把一系列模块组织到一起的文件夹(有一个__init__.py文件的文件夹被称为包)包:一系列py文件的结合体
    4.使用C编写并连接到python解释器的内置模块

为什么要用模块:
    1.调用别人成熟的模块(内置的,第三方的)可以极大的提高使用者的开发效率
    2.当项目规模过大时,为了使程序结构清晰,方便进行管理
  可以把多个文件所需要的公共方法写入一个叫common.py文件中,其他的文件以模块的形式直接调用即可

 如何使用模块:

    模块的使用方法有两种,是import和from.....import......

    使用模块的关键是区分执行文件和被导入文件。

    可以使用__name__方法进行测试,返回值是__main__时,说明文件是可执行文件,返回模块名(没有后缀)时是被导入文件。

    ps : if __name__ == '__main__':  # 快捷写法 main+tab/enter键即可

二.模块使用之import

使用方法 :import  模块名

import sys # 推荐一行一个模块
View Code

右键运行执行的.py文件首先会创建一个该执行文件的名称空间
  首次导入模块xxx.py,执行的三件事
  1.执行xxx.py文件
  2.运行xxx.py文件中的代码将产生的名字与值存放到xxx.py名称空间中
  3.在执行文件中产生一个指向名称空间的名字(xxx)

重复模块只会在第一次导入时,被执行。(第一次执行过后,模块名被写进sys.module,当模块在sys.module存在时,不会被执行)

ps :可以从sys.module中找到当前已经加载的模块.

import diaobao  # 推荐一行一个模块
import sys # 推荐一行一个模块

import diaobao as db

print(sys.modules)  # 查看已加载模块
View Code

使用import导入模块 访问模块中变量的方法:模块名.名字
1.指名道姓的访问模块中的名字 永远不会与执行文件中的名字冲突
2.必须用模块名.名字的方式访问模块中的名字

import可以一次导入多个模块(不推荐使用,看起来代码逻辑不够清晰)

ps:通常导入模块,会写在文件的开头

模块名重命名 import 模块名 as 修改后的模块名

import  sys,diaobao  # 不推荐使用
import diaobao  # 推荐一行一个模块

import diaobao as db


print(db.x)
View Code

三.模块使用之from......import .....

使用方法 :from   模块名 import  变量

from diaobao import x  # 推荐一行一个模块
View Code

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

from...import...:

   优点:引用模块中的名字不用加前缀(模块名),使用更为简洁

   缺点:模块中的名字容易与当前执行文件名称空间中的名字冲突

import sys # 推荐一行一个模块
from diaobao import x  # 推荐一行一个模块

print(x)

x = 30

print(x)
View Code

from md1 import *  # 一次性将md1模块中的名字全部加载过来 不推荐使用 

当所在的py文件被当作模块导入时候,可以该py文件内部使用__all__方法,限制导入者拿到的名字个数

__all__ = ["x"]  # 模块被调用时只能访问变量x
x = "被调用对象"
y = 20
View Code

四.循环导入

循环导入问题出现的原因: 程序设计不合理

假如循环导入问题出现,解决方式如下
    1.方式1
      将导入写在文件最下方(或者被调用的变量之后,导入模块)

    2.方式2
      函数内导入模块

from dir1.dir import m1

m1.f1()
View Code
print('正在导入m1')
def f1():
  from dir1.dir.m2 import y,f2
  print('m1.f1>>>y:',y)
  f2()
x = 'm1'
View Code
print('正在导入m2')
def f2():
  from dir1.dir.m1 import x
  print('m2.f2>>>x:',x)
y = 'm2'
View Code

五.模块的查找顺序

模块的查找顺序
    1.先从内存中找
    2.内置中找
    3.sys.path中找(环境变量):

      sys.path是一个大列表,里面放了一对文件路径,第一个路径永远是执行文件所在的文件夹

print(sys.path)
View Code

六.绝对路径和相对路径

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

相对导入
    .代表的当前路径
    ..代表的上一级路径
    ...代表的是上上一级路径

ps:相对导入不能在执行文件中使用,只能在被导入的模块中使用使用相对导入

     不需要考虑执行文件到底是谁 只需要知道模块与模块之间的路径关系

七.软件目录开发规范

项目名
  bin文件夹
    start.py项目启动文件
  conf文件夹
    settings.py项目配置文件
  core文件
    src.py项目核心逻辑文件
  db文件夹
    数据库文件
  lib文件夹
    common.py项目所用到的公共的功能
  log文件夹
    项目的日志文件
  readme文本文件 介绍项目

# start.py 

import sys
import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
# "os.path.dirname(__file__)"拿到的是当前start.py文件所在的上一层目录

"""
pycharm会自动把项目的最顶层的目录自动添加到sys.path中

"""
from core import src

if __name__ == '__main__':
    src.run()
View Code
原文地址:https://www.cnblogs.com/Cpsyche/p/11196329.html