• Python面向对象之模块和包


    模块

    模块的概念

    模块是Python程序架构的一个核心概念

    • 所有以.py结尾的源文件都是一个模块;
    • 模块名也是标识符,需要遵循标识符的命名规则;
    • 在模块中定义的全局变量,类,函数,都是直接给外界使用的工具;
    • 模块就好比一个工具包,而里面的函数和变量就是工具,要想使用模块,先导入;

    模块的两种导入方式

    方式1:import 导入

    导入方式如下:

    import 模块名1,模块名2
    

    在pep8中建议,每次导入的模块应该独占一行
    即:

    import 模块名1
    import 模块名2
    

    导入之后。通过 模块名. 调用模块中的全局变量,函数,类

    使用as指定模块的别名
    如果模块的名字太长,可以使用as指定模块的名称,以便在代码中的使用;语法如下:

    import 模块名1 as 模块别名
    

    注意,模块别名应该符合大驼峰命名法

    示例:

    import game_show_help as help
    import game_start_play as play
    # 后面的代码只需要将模块名替换一下即可
    

    方式2:from... import xx

    • 如果希望从某一模块中,导入部分工具,就可以使用 from ... import的方式;
    • import 模块名 是一次性将模块中的所有工具导入,并且通过 模块名/别名 访问;

    导入部分工具语法如下:

    # 从 某模块 导入 某工具
    from 模块名1 import 工具名
    

    导入之后,不再需要通过 模块名. 使用工具,可以直接使用模块提供的工具--类,函数,全局变量;

    from ... import *(了解)

    # 从模块 导入所有工具
    from 模块名1 import *
    

    这种方式不推荐使用,因为函数重名时并没有任何提示,出现问题不好排查。

    导入同名函数

    注意:如果两个模块,存在同名的函数,后导入的函数,会覆盖先导入的函数
    和这个类似的是类的继承,但顺序不同,优先使用先继承的类中的方法;

    • 开发时import代码应该统一写在代码顶部,更容易及时发现冲突;
    • 一旦发现冲突,可以使用as关键字给其中一个同名工具起别名

    模块搜索顺序

    python解释器在导入模块时,会:

    1. 搜索当前目录指定模块名的文件,如果有则直接导入;
    2. 如果没有,再搜索系统目录;

    在开发时,给文件起名,不要和系统的模块文件重名
    可以使用模块的内置属性 模块名.file 可以查看模块的文件路径

    如果当前目录下存在一个和系统的模块文件重名的文件,会优先调用当前目录文件,从而引起错误;

    开发原则及导入模块问题

    开发原则

    开发原则--每一个文件都应该是可以被导入的

    • 一个独立的python文件就是一个模块;
    • 在导入模块时,模块文件中所有没有任何缩进的代码都会被执行一遍;

    实际开发场景

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

    导入模块存在问题

    当我们导入一个文件时,文件中所有未缩进的代码都会被执行一遍,比如print或者调用函数等,而这并不是我们希望看到的;

    例如,以下是两个文件:

    cp_06test1.py

    def say_hello():
        print("hello python")
    
    
    print("test1")
    
    say_hello()
    

    cp_07use_test.py

    import cp_06test1
    
    
    print("-"*50)
    
    # test1
    # hello python
    # --------------------------------------------------
    

    我们可以看到,在第二个文件中,只导入并且随意输出一个字符;在导入时首先会将第一个文件的代码执行一遍,再执行第二个文件中的内容。

    用__name__属性解决测试和调用问题

    __name__属性,可以做到,测试模块的代码只在测试情况下被运行,而在被导入时不会被执行;

    __name__是python中的一个内置属性,记录着一个字符串;

    如果是被其他文件导入的,__name__就是模块名;
    如果是当前执行的程序,__name__就是__main__;
    

    我们可以根据这个特性来给测试代码添加缩进,这样,在本地代码就可以只在本地执行被执行,而在被导入时不会被执行;

    使用__name__解决示例如下:

    cp_06test1.py

    def say_hello():
        print("hello python")
    
    
    # 判断是否是在本函数执行,如果是在本函数执行,就执行以下代码
    # 如果是被其他文件的函数调用,则略过下列代码
    if __name__ == "__main__":
        print(__name__)  # __main__
    
        print("test1")
    
        say_hello()
    

    cp_07use_test.py

    import cp_06test1
    
    
    # 未使用__name__前,在调用test1时,输出的__name__为 cp_06test1
    
    print("-"*50)
    
    cp_06test1.say_hello()
    
    # --------------------------------------------------
    # hello python
    

    包的概念和创建使用

    包概念

    • 包是一个包含多个模块的特殊目录;
    • 目录下有一个特殊的文件 init.py 文件;
    • 包名的命名方式和变量名一致,字母数字下划线,但不能以数字开头;
    • 作用:使用 import 包名 可以一次性导入包中的所有模块;

    init.py

    要在外界使用包中的模块,需要在 init.py 中指定对外界提供的模块列表
    __init__中的内容可能如下:

    from . import 模块名1
    from . import 模块名2
    

    包的建立方式

    通用:

    先新建一个文件,命名应该符合包;
    然后在文件下建立__init__.py文件,就是包了;
    

    pycharm下:

    右键,python packge,输入包名,IDE自动创建包。
    

    包的使用演练

    message包下有:init.py;send_message.py;receive_message.py。

    send_message.py内容

    def send(mess):
        print("发送消息 %s" % mess)
    

    receive_message.py内容

    def receive():
        print("收到消息")
    

    init.py内容

    from . import send_message
    from . import receive_message
    

    包外文件:
    use_packge.py内容

    import message
    
    message.send_message.send("xiaoxi")
    message.receive_message.receive()
    
    # 发送消息 xiaoxi
    # 收到消息
    

    自制第三方模块及安装卸载

    制作模块压缩包

    linux下

    1.创建 setup.py
    在准备好的模块文件的统计目录,创建setup.py文件;
    setup.py和要发布的模块文件同级目录,不是下级;

    setup.py内容:

    from distutils.core import setup
    
    setup(
        name='xxx',  # 包名
        version='1.0.0',  # 版本
        author='xxx',  # 作者
        author_email='xxx@163.com',  # 作者邮箱
        url='xxx.com',  # 网址/主页
        description='这是我的第一个发布安装文件'  # 描述信息
        py_moudles=["包名.模块名1", "包名.模块名2"]
    )
    

    2.构建模块

    python3 setup.py build
    

    3.生成发布压缩包

    python3 setup.py sdist
    

    可以将制作好的模块压缩包直接发送给别人,按照后面学习的 安装包 内容解压缩安装即可;
    但如果需要将包上传到网上供别人的话,可以自行百度(也可以上传到github上)。

    安装模块压缩包

    tar -zxvf message-1.0.tar.gz
    sudo python setup.py install
    

    卸载模块

    可以使用 message.file 查看完整文件目录,以便删除;

    卸载模块
    直接从安装目录下,把安装模块的目录删除就可以了;

    cd usr/local/lib/python3.5/dist-packages/
    sudo rm -r message*
    

    pip安装第三方模块

    • 第三方模块通常是指 由知名的第三方团队开发的 并且被python程序员广泛使用的包/模块;
    • pip是一个现代的,通用的python包管理工具;
    • 提供了对python包的查找,下载,安装,卸载等功能;

    安装和卸载命令如下:

    sudo pip install pygame
    sudo pip uninstall pygame
    

    pip安装卸载演示

    # 将模块安装到python3.x环境下
    sudo pip3 install pygame
    sudo pip3 uninstall pygame
  • 相关阅读:
    JZ2440开发板开发环境搭建
    20180730-宿主机开发环境搭建
    20180319-双网卡电脑同时上内外网
    嵌入式ARM板子起步
    20180127-服务器开发环境搭建
    Pool多进程示例
    Python基础-day01
    解释型语言与编译型语言
    C 编译过程浅析
    博客奇谭
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-20.html
Copyright © 2020-2023  润新知