zoukankan      html  css  js  c++  java
  • python面向对象(八、包、模块)

    12.模块和包
    12.1 模块
    12.1.1 模块的概念
    模块是Python程序架构的一个核心概念,模块的本质就是一个对象
    1)每个以py结尾的Python源代码文件都是一个模块,文件名就是模块名
    2)模块名是一个标识符,需要符合标识符的命名规则
    3)在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具
    4)模块就好比是工具包,要想使用这个工具包中的工具,就需要先导入这个模块
    5)模块分类:python内置模块、自定义模块、第三方模块

    12.1.2 模块的导入方式
    12.1.2.1 import 导入
    在导入模块时,每个导入应该独占一行
    import 模块名1
    import 模块名2
    一个import后面也可以跟多个模块,但PEP8不建议这样使用
    import 模块名1,模块名2

    导入之后:
    通过“模块名.”使用模块提供的工具:全局变量、函数、类


    执行结果:

    12.1.2.2使用“as”指定模块的别名(尽量不用)
    如果模块的名字太长,可以使用“as”指定模块的名称,以方便在代码中的使用
    格式:import 模块名1 as 模块别名
    注意:模块别名应该符合大驼峰命名法

    12.1.2.3from...import 导入
    如果希望从某一个模块中,导入部分工具,就可以使用from...import的方式
    import模块名是一次性把模块中所有工具全部导入,并且通过模块名/别名访问
    格式:from 模块名 import 工具名
    导入之后:不需要通过“模块名.”,可以直接使用模块提供的工具:全局变量、函数、类

    注意:
    1)如果两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入的函数
    2)开发时import代码应该统一写在代码的顶部,更容易及时发现冲突
    3)一旦发现冲突,可以使用as关键字给其中一个工具起一个别名

    12.1.2.4 from...import *(知道)
    导入模块的所有工具
    格式:from 模块名 import *
    如果两个模块,存在同名的函数,那么后导入模块的函数,会覆盖掉先导入模块的函数
    注意:这种方式不推荐使用,因为函数重名并没有任何的提示,出现问题不好排查

    12.1.3 模块导入的过程
    1)判断内存中是否有master
    2)如果有直接拿来使用
    3)如果没有,会开辟一个内存空间。在内存空间中执行模块中的代码
    4)默认把名称空间的名字(模块名)引入进来

    12.1.4 模块导入的规范
    1)导入模块写在py文件的最开始
    2)导入模块的顺序:
    (1)导入内置模块
    (2)导入第三方模块
    (3)导入自己定义的模块

    12.1.5 模块的搜索顺序[扩展]
    Python的解释器在导入模块时,会:
    1)搜索当前目录指定模块名的文件,如果有就直接导入
    2)如果没有,再搜索系统目录
    在开发时,给文件起名,不要和系统的模块文件重名

    12.1.6 “file” 属性:
    Python中每一个模块都有一个内置属性“file”可以查看模块的完整路径

    注意:如果当前目录下,存在一个random.py的文件,程序就无法正常执行了!
    Python的解释器会加载当前目录下的random.py而不会加载系统的random模块

    12.1.7 “name”属性:判断文件名
    1)一个独立的Python文件就是一个模块
    在导入文件时,文件中所有没有缩进的代码都会被执行一遍!

    2)实际开发场景:
    在实际开发中,每一个模块都是独立开发的,大多都有专人负责
    开发人员通常会在模块下方增加一些测试代码。仅在模块内使用,而被导入到其他文件中不需要执行

    3)__name__属性可以做到:测试模块的代码只在测试情况下被运行,而在被导入时不会被执行!
    __name__是Python的一个内置属性,记录着一个字符串:
    (1)如果是被其他文件导入的,name__就是模块名
    (2)如果是当前执行的程序__name__是__main


    4)增加判断语句,避免导入时被执行。

    if name == "main": 被称为程序的入口

    在很多Python文件中都会看到以下格式的代码:

    12.1.8 修改模块中的变量
    1)使用global只能修改本当前文件中的变量,无法修改其它文件的变量

    2)使用from ...import...导入,可以直接使用的变量

    12.1.9 sys.path 模块搜索路径(环境变量)
    1)sys.path是python的搜索模块的路径集,是一个list

    搜索模块的路径集包括:
    (1)当前目录
    (2)项目根目录
    (3)python解释器目录
    (4)自定义添加的目录

    2)添加搜索路径sys.path.append(),添加路径后可以正常导入模块了

    test123的红色下划线,是由于pycharm软件的搜索路径只有当前文件夹,所以会报错。

    3)注意:sys.path随着文件的位置不同,它的模块搜索路径也会发生变化

    4)通常python的启动文件放在项目的根目录下,根目录下的文件夹是“包”

    12.2 包(Package)
    12.2.1 概念
    1)包是一个包含多个模块的特殊目录
    2)目录下有一个特殊的文件__init__.py
    3)包名的命名方式和变量名一致,小写字母、数字 和 “_”
    使用import包名,可以一次性导入包中所有的模块
    使用from 包名import模块名,可以导入包中某个的模块

    12.2.2 init.py
    1)导入包时,相当于执行包内__init__.py文件。并不会将包内所有文件放入内存

    2)使用包中模块内的变量,需要在__init__.py文件中导入模块
    方法一:绝对导入

    方法二:相对导入,使用“.”代表同级目录

    内含相对导入的文件,被其他文件导入后可以正常使用。

    内含相对导入的文件,在当前文件中直接使用被导入的文件,会报错

    绝对导入和相对导入的适用情况:
    (1)当你写一个功能,这个功能不是直接运行的,而是被其他文件导入后使用的,如果你的这个独立功能形成文件夹,文件夹内所有文件都要使用相对导入。
    (2)如果我们自己开发一个项目,这个项目有一些文件是需要直接运行的,这种情况下,适合使用绝对导入
    注意:
    (1)import包后,使用包名.模块名.变量名。需要在__init__.py文件中写代码,不建议这样使用
    (2)建议使用from 包名 import 模块名,这样可以通过“模块名.变量名”,直接使用变量。

    12.2.3 创建和使用包
    1)新建包:项目名称右击 -> New -> Python Package

    2)在包中可以创建py文件(模块)

    3)使用包

    12.2.4 绝对路径和相对路径导入包
    1)绝对路径导入包,从sys.path开始,也就项目文件根目录或当前目录
    运行000_test.py

    运行test_c.py

    2)相对路径导入包,从当前文件夹开始
    运行000_test.py

    运行test_c.py报错

    注意:包的导入,只允许导入运行路径的子文件夹,不允许导入运行路径的父文件夹。为了保护包外面的代码不被修改
    我们自己使用一般用绝对路径,第三方开源框架一般使用相对路径

    12.2.5 案例演练
    1)新建一个“hm_message”的包

    2)在目录下,新建两个文件“send_message.py”和“receive_message.py”

    3)在send_message文件中定义一个send函数

    4)在receive_message文件中定义一个receive函数

    5)在外部直接导入hm_message的包
    (1)在__init__.py中指定对外界提供的模块列表
    要在外界使用包中的模块,需要在__init__.py中指定对外界提供的模块列表

    (2)输入时,会有相应提示

  • 相关阅读:
    GC原理知多少
    C# 编译运行原理
    NetCore无需添加web/wcf引用来调用webservice
    WPF基础知识-资源概述
    WPF基础知识-XAML概述
    WPF入门-使用C#创建简单应用
    WPF概述
    Entity Framework Core
    Entity Framework Core
    Entity Framework Core
  • 原文地址:https://www.cnblogs.com/bdzxh/p/14074320.html
Copyright © 2011-2022 走看看