包和模块笔记

模块


一个模块就是一个包含python代码的文件。一个文件就是一个模块

为什么要使用模块


1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
3.模块可以当作命名空间

如何定义自己的模块


模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。

变量         模块中的属性值
函数         单独的功能
类           相似功能组合
模块测试代码   临时使用,被导入时不会执行

测试代码

测试代码经常在开发模块时用于测试模块的功能,但是测试代码仅在开发和测试时使用,被当作模块导入时不希望测试代码运行。需要使用name特殊变量来操作。


if __name__  == '__main__':
    #测试代码区域(仅在把当前文件直接运行时才会执行测试代码,当作模块导入时则不会执行)

__name__  在直接运行当前文件时,结果为__main__

__name__  被当作模块导入文件时,结果为 模块名称

__name__就是标识模块的名字的一个系统变量。这里分两种情况:假如当前模块是主模块(也就是调用其他模块的模块),那么此模块名字就是__main__,通过if判断这样就可以执行“__mian__:”后面的主函数内容;假如此模块是被import的,则此模块名字为文件名字(不加后面的.py),通过if判断这样就会跳过“__mian__:”后面的内容。

模块的导入方式


import 模块名

作用:直接导入模块
使用方法:
    模块名.变量名
    模块名.函数名
    模块名.类名.方法名()
    模块名.类名.属性名

import 模块 as 别名

作用:直接导入模块,并且为模块起一个别名
使用方法:
    别名.变量名
    别名.函数名
    别名.类名.方法名()
    别名.类名.属性名

from 模块 import 某个函数或者类

作用:直接导入模块中的某个方法或者某个类或变量
使用方法:
    函数名()
    变量名
    类名.方法名()
    属性名

from 模块 import 函数,函数,类,类…

作用:直接导入模块中的多个方法和多个类和变量
使用方法:
    函数名()
    变量名
    类名.方法名()
    属性名
from 模块 import *
作用:直接导入模块中的所有方法和类和变量
使用方法:
    函数名()
    变量名
    类名.方法名()
    属性名

注意事项:如果采用from 导入的方式要确保模块中的函数变量等内容不能与系统的内置函数同名,否则会出现异常。

模块的存放


如果不想自己新建自定义的模块文件夹,可以将我们自定义的模块存放到 python 目录中的\Lib\site-packages中。

搜索路径就是python在加载模块时候的查找路径

1.获取当前模块的搜索路径

import sys

sys.path  获取当前搜索路径的列表

2.将自定义的路径添加到列表中

sys.path.append(自定义路径)  #临时添加

在python目录site-packages中创建hjq.pth文件,然后将路径写入进去,就可以永久写入

模块的加载顺序


导入模块操作的步骤:

1.检测内存中是否已经加载过当前模块,如果加载过,直接使用加载的模块
2.如果内存中没有加载当前模块,则搜索python的内置模块
3.如果当前内置模块中中没有该模块,根据搜索路径查找并且加载模块


包就是文件夹,他用于存放文件也就是模块。包中也可以存放包

包的结构


包
|---- __init__.py 包的标志文件
|---- 模块1
|---- 模块2
|---- 子包(文件夹)
|-----|----__init__.py
|---- |----子模块1
|---- |----子模块2

包的导入和使用

import 包.模块

使用方法:
    包.模块.变量名
    包.模块.函数名()
    包.模块.类名.属性名
    包.模块.类名.方法名()

import 包.模块 as 别名

使用方法:
    别名.变量名
    别名.函数名()
    别名.类名.属性名
    别名.类名.方法名()

from 包.模块 import 函数或者类或者属性

使用方法:
    变量名
    函数名()
    类名.属性名
    类名.方法名()
from 包.模块 import *
使用方法:
    变量名
    函数名()
    类名.属性名
    类名.方法名()

在__init__.py文件中添加内容(当模块用)


在此情况下可以将包当作模块直接导入使用

import 包

使用:
    包.变量名
    包.函数名()
    包.类名.属性名
    包.类名.方法名()

import 包 as 别名

使用:
    别名.变量名
    别名.函数名()
    别名.类名.属性名
    别名.类名.方法名()

from 包 import 函数,类,变量

使用:
    变量名
    函数名()
    类名.属性名
    类名.方法名()
from 包 import *
使用:
    变量名
    函数名()
    类名.属性名
    类名.方法名()
包和模块的互相调用问题

如果在当前模块中需要调用其他模块或者包的内容时,可以直接使用import 导入对应的包和模块,就可以加载进来使用,import 会搜索包和模块对应的搜索路径(sys.path)

import  模块或者包
import 模块:导入一个模块;注:相当于导入的是一个文件夹,是个相对路径。
from…import:导入了一个模块中的一个函数;注:相当于导入的是一个文件夹中的文件,是个绝对路径。
不推荐使用 from xx import * 这种导入方式
缺点一 :如果导入的模块变量太多则会占用大量内存,程序运行性能会降低
缺点二 :变量太多容易导致自己定义的变量和导入的变量重名,会出现bug。
import导入的使用场景 :导入系统模块,或者导入需要进行全局共享的模块

__all__特殊变量的用法

  • 在__init__.py文件中,如果没有__all__变量,那么使用from 包 import * 仅导入__init__.py中定义的方法和类及其他内容

  • 在init.py文件中,如果定义all变量,那么使用from 包 import * 则会导入all指定的所有模块,而忽略init.py文件中的信息

    __all__ = [‘模块’,‘模块’,‘子包’。。。] #必须是列表,元素为字符串

      #init文件通常是空文件,定义了包的属性和方法
      init必须存在,如果不存在就是个目录。就不能导入或者包中的子包
      #还可以在init中导入其他模块,这样就可以直接调用。
    

胡宏毅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值