Python自定义模块

文章目录

    • 前言
    • import引用模块
    • from ... import ... 引用模块
    • from...import *(尽量别单独用)

前言

简单来说一个模块就是一个py文件,这个模块是存储很多相似的功能,相似的函数的集合体

  • 节省代码
  • 容易维护,组织结构更清晰
    而模块主要分为下面三种
  • 内置模块(标准库)python解释器自带的 time、os、sys等等
  • 第三方库模块(大神自写)通过pip install…安装
  • 自定义模块
    这次主要分享自定义模块的部分,大的也可以分为以下几部分

import引用模块

  • 当执行文件引用多次模块时,实际只加载一次

    • import LY
      #当我引用LY模块时,实际上将LY.py执行一遍,加载到内存
      import LY
      import LY
      #只是第一次引用时,将此模块加载到内存
      
      运行结果:from the LY.py
      

以下为执行文件和模块文件,以此来了解引用模块的过程

  • 自定义模块.py(执行文件)

    import LY
    n = 1
    
  • 被引用文件(模板) LY.py

  • print('from the LY.py')
    name = 'LY'
    
    def read1():
        print('LY模块', name)
    
    def read2():
        print('LY模块')
        read1()
        
    def change():
        global name
        name = 'XXL'
    
  • 引用模块发生三件事

    • 1、将LY.py文件加载到内存
    • 2、在内存中创建一个以LY命名的名称空间
    • 3、通过LY名称空间的名字.的方式引用此模块的名字(变量、函数名、类名等等)

三件事情图示:

Python自定义模块_第1张图片

​ 第三步引用:

import LY
print(LY.name)
LY.read1()
LY.read2()
LY.change()
LY.read1()
运行结果:
from the LY.py
LY
LY模块 LY
LY模块
LY模块 LY
LY模块 XXL

通过import 引用模块,他有自己的独立空间,与当前执行文件无关系

模块名字.引用,一定在此模块中寻找

  • 起别名:将一个比较长的模块名化简成简单的 import configure as cf

    • 书写方便
    • 简化代码
  • 引入多个模块

    • import time,os,sys 不推荐

    • import time

      import os

      import sys 多行导入 易于阅读 易于编辑 易于搜索 易于维护

from … import … 引用模块

  •  from LY import name
     from LY import read1
     from LY import read2
     print(globals())
     
     运行结果:...'name': 'LY', 'read1': <function read1 at 0x0000025F986CD430>, 'read2': <function read2 at 0x0000025F9894D3A0>}
    

    相当于从LY模块的全局空间中将name,read1变量与值的对应关系复制到当前执行文件的全局名称空间中

  • 优点:使用起来更加方便

  • 缺点:容易与当前执行文件产生覆盖效果(import不易产生覆盖)

    from LY import name
    print(name)
    name = 'xll'
    print(name)
    
    运行结果:LY
    		xll
        
    
  • :引用模块中的函数,如果此函数用到一些变量,这些变量还是从此模块中寻找,不会改变当前执行文件的变量(特殊情况,因为你引用一些模板的变量,必须做到执行文件中没有同名变量)

    • 执行文件:from…import… .py

      from LY import name
      from LY import change
      change()
      print(name)
      
      运行结果:LY
      

Python自定义模块_第2张图片

eg:

from LY import change
change()
from LY import name
print(name)
运行结果:XXL
  • 起别名:

    from LY import name as n
    print(n)
    
  • 引入多个模块:与import引用模块相同

from…import *(尽量别单独用)

  • 1、所有名字全部复制

  • 2、容易覆盖

  • 配合使用:from … import * 与__all__配合使用

  • 将*的所有范围缩小__all__

  • eg:__all__ = [‘read1’, ‘read2’] (写于模块中)

    模块LY.py
    __all__ = ['read1']
    执行文件:
    from LY import *
    change()
    运行结果:NameError: name 'change' is not defined
    
  • py文件的两种功能

    • 1、执行文件(承载代码)脚本 直接打印__name__返回__main__
    • 2、模块(被执行文件)直接打印__name__返回模块名
    • 作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码 ) if __name__ == ‘__main__’: …
  • 模块的搜索路径:内存中 --> 内置模块 -->sys.path(模块可寻找的路径)中找

    • import sys
      print(sys.path)
      
      运行结果:['C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\15day', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1', 'D:\\BaiduNetdiskDownload\\python39.zip', 'D:\\BaiduNetdiskDownload\\DLLs', 'D:\\BaiduNetdiskDownload\\lib', 'D:\\BaiduNetdiskDownload', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\venv', 'C:\\Users\\ASUS\\PycharmProjects\\pythonProject1\\venv\\lib\\site-packages']
      看第一个参数为当前路径
      
    • 应用:输出结果为列表,因此当文件不在此当前路径中时,我们可以考虑使用列表的添加操作
      sys.path.append(r’C:\Users\ASUS\PycharmProjects\pythonProject1\16day’)

你可能感兴趣的:(python,开发语言)