• 8、python中的模块和包


    模块

    模块就是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块
    模块是非常简单的Python文件,单个Python文件就是一个模块,两个文件就是两个模块。

    python模块实质上是一个python文件,当导入模块,会优先从当前目录中找该模块对应的python文件。因此,需要注意自定义的python文件的文件名不要和已有的模块冲突
    比如,不要自己创建文件requests.py,这和request模块对应文件名冲突

    模块导入的方式

    创建文件 hello.py

    digits='0123456789'
    
    def login():
        print('login...')
    
    • 1
    • 2
    • 3
    • 4

    导入模块,实质就是加载并执行模块的内容

    直接导入

    创建文件 模块.py
    导入hello模块,能调用hello模块中的变量和函数

    import hello
    print(hello.digits) #可以调用hello模块中的变量和函数
    print(hello.login())
    
    • 1
    • 2
    • 3

    在这里插入图片描述这只是导入模块的一种方法。
    还有一种方法就是可以只导入模块的一部分信息:

    部分导入

    from hello import  login  #导入模块的一部分信息
    login()
    
    from hello import login as f  #也可以给导入的一部分信息起别名
    f()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    import module 和from module import *的区别

    • import module,引用模块中的变量时要用module.变量名;
    • from module import *,引用模块中变量时只需直接使用变量名
    • import module,使用模块中的变量时,使用的是原模块中的变量,不会创建新的变量;
    • from module import *,使用模块中的变量时,会把原模块中的变量复制到本地,会创建新的对象。开发中建议用import module。

    原文链接:https://blog.csdn.net/weixin_44857400/article/details/108083690

    模块的其他信息

    编辑hello.py

    """
    hello模块的说明文档
    """
    digits='0123456789'
    
    def login():
        print('login...')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    import sys
    print(sys.path)  #打印导入该模块,依次从哪几个路径寻找
    import hello
    print(dir(hello)) #查看hello模块可以使用的信息,比如变量和函数...
    
    print(hello._ _doc_ _) #查看hello模块的说明文档
    print(hello._ _file_ _) #查看hello模块的绝对路径
    print(hello._ _name_ _) #当hello模块被导入时,显示模块的名称
    print(hello._ _dir_ _) #当hello模块被导入时,显示模块的所有可以使用的方法
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    编辑 hello.py

    """
    hello模块的说明文档
    """
    digits = '0123456789'
    
    def login():
        print('login...')
       
    #当用户使用From module import *导入模块全部内容时,__all__指定导入的内容 
    _ _all_ _=['digits'] 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在其他文件中只能导入_ _ all _ _指定的内容

    from hello import *
    print(digits) #只能导入digits变量
    # print(login())
    
    • 1
    • 2
    • 3

    _ _ name _ _ 的特殊使用

    _ _ name _ _ 在不同的场景下,值不同
    在模块内部执行时,值为_ _ main _ _
    当模块被导入执行时,值为模块名

    在 hello.py 内部

    """
    hello模块的说明文档
    """
    digits = '0123456789'
    
    def login():
        print('login...')
    
    # 当模块内部运行,需要执行的代码。当模块被导入时,不执行
    if _ _name_ _ == '__main__':
        print(_ _name_ _)  # 当在模块内部执行_ _name_ _,其值为_ _main_ _
        # 当该模块被导入,_ _name_ _的值为模块的名字,即hello
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    适用于一个场景:一些测试代码适合在单独执行文件时执行,而在被其他文件引用时不执行。
    就可以借助变量_ _ name _ 。当该文件是单独执行时,变量 _ name _ 的值为 _ main _ 。当该文件(模块)被其他文件导入,那么变量 _ name _ _值为模块名。从而写一个if判断即可。

    模块的分类

    • 内置模块(只要装了python解释器,就有的模块):time、datetime、random、string
    • 第三方模块(需要自己安装的模块):requests、pandas、colorama(颜色模块)、faker
    • 自定义模块(自己编写的python文件(模块)或包)
    import  time
    print(time.time()) #打印时间戳
    print(time.ctime()) #字符串的时间 Thu Dec  1 17:04:03 2022
    tuple_time=time.localtime() #命名元组的时间
    print(tuple_time)
    print(tuple_time.tm_year) #2022
    
    from datetime import date,datetime,timedelta
    print(date.today()) #获取今天的日期 2022-12-01
    print(datetime.now()) #获取当前时间 2022-12-01 17:02:13.958248
    print(date.today() + timedelta(days=3)) #获取3天后的日期
    print(date.today() - timedelta(days=3)) #获取3天前的日期
    print(datetime.now() + timedelta(minutes=10)) #获取10分钟之后的时间
    print(datetime.now() - timedelta(minutes=10)) #获取10分钟之前的时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    import random
    print(random.random()) # 随机生成0-1之间的小数
    print(random.randint(1,10)) # 随机生成1-10之间的整数
    print(random.choice(['a','b','c','d','e'])) #随机选择一个元素
    print(random.choices(['a','b','c','d','e'],weights=[1,1,5,2,10])) #随机选择一个元素,并对元素设置权重
    print(random.sample(['a','b','c','d','e'],3)) #随机选择n元素,这个n等于3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    import string
    print(string.digits) #获取所有的数字
    print(string.ascii_letters) #获取所有的字母
    print(string.ascii_lowercase) #获取所有的小写字母
    print(string.ascii_uppercase) #获取所有的大写字母
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    colorama 是颜色模块,能设置字体颜色

    import colorama 
    #from colorama import Fore
    print(colorama.Fore.RED + 'Error: 主机不存在')
    print(colorama.Fore.GREEN + 'Success: 主机创建成功')
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    faker 是生成测试信息的模块

    from faker import  Faker
    fake = Faker('zh-cn') # 随机生成中文的信息
    print(fake.name())  #随机生成名字, 马建
    print(fake.address()) # 随机生成地址
    print(fake.email()) #随机生成邮箱
    
    • 1
    • 2
    • 3
    • 4
    • 5

    包将有联系的模块组织在一起,有效避免模块名称冲突问题,让应用组织结构更加清晰。
    python中的模块实质就是一个文件,那么包是将有联系的模块组织到一起,那么包就相当于是个文件夹。

    一个普通的python应用程序目录结构:

    在这里插入图片描述

    其中_ _ init _ _.py是初始化文件。

    在pycharm中新建一个 python package会发现默认有一个文件_ _ init _ _.py,而新建一个directory则什么也没有。这也是package和directory的唯一区别。

    创建一个python package 名为 sdk,然后在包内创建模块 ali.py、huawei.py
    编辑文件_ _ init _ _.py

    print("正在导入包sdk")
    
    • 1

    编辑模块ali.py,创建函数

    def create_ecs():
        print('创建阿里云ecs')
    
    def create_ecs():
        print('删除阿里云ecs')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编辑模块huawei.py,创建函数

    def create_ecs():
        print('创建华为云ecs')
    
    def create_ecs():
        print('删除华为云ecs')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    新建python文件,导入建立的sdk包,

    import sdk
    
    • 1

    执行该文件,显示:
    在这里插入图片描述说明,导入包的实质就是执行包里面的_ _ init _ _.py内容

    从包中导入模块的方式

    方法一:
    指明从包中导入的模块

    from sdk import ali
    from sdk import huawei
    
    ali.create_ecs()
    huawei.create_ecs()
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    方法二:
    在文件_ _ init _ _.py中指定导入模块
    编辑文件 _ _ init _ _.py

    #print("正在导入包sdk")
    from . import ali
    from . import huawei
    
    • 1
    • 2
    • 3

    新建python文件,导入包

    import sdk
    sdk.ali.create_ecs()
    sdk.huawei.create_ecs()
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    CCIE-15-MPLS-VPN
    C/C++图书管理系统
    Java代码如何对Excel文件进行zip压缩
    Java常用类,这一次帮你总结好
    五月刚入职字节跳动,测试开发面试题整理,还热乎的
    C++ 补充 反向迭代器的实现
    Vue——vue3+element plus实现多选表格使用ajax发送id数组
    免疫抑制作用的转录抑制分子
    Docker安全及日志管理
    hdoj 3549 Flow Problem 【最大流入门 dinic算法】
  • 原文地址:https://blog.csdn.net/qq_43604376/article/details/128129077