Python 包管理

简介: Python 包管理详解

1. 模块

  • 一个模块就是一个包含python代码的文件,后缀名称是.py就可以,模块就是个python文件
  • 为什么我们用模块

    • 程序太大,编写维护非常不方便,需要拆分
    • 模块可以增加代码重复利用的方法
    • 当作命名空间使用,避免命名冲突
  • 如何定义模块

    • 模块就是一个普通文件,所以任何代码可以直接书写
    • 不过根据模块的规范,最好在本块中编写以下内容

      - 函数(单一功能)
      - 类(相似功能的组合,或者类似业务模块)
      - 测试代码
      
  • 如何使用模块

    • 模块直接导入

      - 模块名称直接以数字开头,需要借助importlib帮助
    • 语法

      import module_name
      module_name.function_name
      module_name.class_name
    • 案例 01.py,02.py,p01.py,p02.py

          # 案例 01.py
          # 包含一个学生类
          # 一个sayHello函数
          # 一个打印语句
      
          class Student():
              def __init__(self, name = "NoName", age = 18):
                  self.name = name
                  self.age = age
          
              def say(self):
                      print("My name is {0}".format(self.name))
          
          def sayHello():
              print("Hi, ")
          
          print("我是模块p0")
          
          # 案例 02.py
          # 借助于importlib包可以实现导入以数字开头的模块名称
          import importlib
          
          # 相当于导入了一个叫01的模块并把导入模块赋值给了a
          
          a = importlib.import_module("01")
          stu = a.Student()
          stu.say()
          # 案例 p01.py
          # 包含一个学生类
          # 一个sayHello函数
          # 一个打印语句
          
          class Student():
              def __init__(self, name = "NoName", age = 18):
                  self.name = name
                  self.age = age
          
              def say(self):
                      print("My name is {0}".format(self.name))
          
          def sayHello():
              print("Hi, ")
          
          # 此判断语句建议一直作为程序的入口
          if __name__ == '__main__':
              print("我是模块p01")
          # 案例 p02.py
          import p01
          
          stu = p01.Student("xiaojing", 19)
          
          stu.say()
          
          p01.sayHello()
          My name is xiaojing
          Hi, 
    • import 模块 as 别名

      - 导入的同时给模块起一个别名
      - 其余用法跟第一种相同
      - 案例 p03.py
      
          # 案例 p03.py
          import p01 as p
          
          stu = p.Student("yueyue", 18)
          stu.say()
          My name is yueyue
    • from module_name import func_name, class_name

      - 按上述方法有选择性的导入
      - 使用的时候可以直接使用导入的内容,不需要前缀
      - 案例 p04
      
          # 案例 p04.py
          from p01 import Student, sayHello
          
          stu = Student()
          
          stu.say()
          
          sayHello()
        My name is NoName
        Hi,    
    • from module_name import *

      - 导入模块所有内容
      - 案例 p05.py
      
             # 案例 p05.py
          from p01 import *
          
          sayHello()
          
          stu = Student("yaona", 20)
          stu.say()
          Hi, 
          My name is yaona
  • if __name__ == `__main__` 的使用

    • 可以有效的避免模块代码被导入的时候被动执行的问题
    • 建议所有程序的入口都以此代码为入口

2. 模块的搜索路径和存储

  • 什么是模块的搜索路径

    • 加载模块的时候,系统会在哪些地方寻找此模块
  • 系统默认的模块搜索路径

    import sys
    sys.path  属性可以获取路径列表
    # 案例 p06.py
    
        # 案例 p06.py
        import sys
        
        print(type(sys.path))
        print(sys.path)
        
        for p in sys.path:
            print(p)
            <class 'list'>
        ['D:\\python\\project\\包管理', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'D:\\python\\project', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\third_party\\thriftpy', 'D:\\PyCharm Community Edition 2019.1.1\\helpers\\pydev', 'C:\\Users\\user\\.PyCharmCE2019.1\\system\\cythonExtensions', 'D:\\python\\project\\包管理', 'D:\\Anaconda3\\envs\\opp\\python37.zip', 'D:\\Anaconda3\\envs\\opp\\DLLs', 'D:\\Anaconda3\\envs\\opp\\lib', 'D:\\Anaconda3\\envs\\opp', 'D:\\Anaconda3\\envs\\opp\\lib\\site-packages']
        D:\python\project\包管理
        D:\PyCharm Community Edition 2019.1.1\helpers\pydev
        D:\python\project
        D:\PyCharm Community Edition 2019.1.1\helpers\third_party\thriftpy
        D:\PyCharm Community Edition 2019.1.1\helpers\pydev
        C:\Users\user\.PyCharmCE2019.1\system\cythonExtensions
        D:\python\project\包管理
        D:\Anaconda3\envs\opp\python37.zip
        D:\Anaconda3\envs\opp\DLLs    
        D:\Anaconda3\envs\opp\lib
        D:\Anaconda3\envs\opp
        D:\Anaconda3\envs\opp\lib\site-packages
    
  • 添加搜索路径

    sys.path.append(dir)
  • 模块的加载顺序

    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

  • 包是一种组织管理代码的方式,包里面存放的是模块
  • 用于将模块包含在一起的文件夹就是包
  • 自定义包的结构
    |---包
    |---|---  __init__.py  包的标志文件
    |---|---  模块1
    |---|---  模块2
    |---|---  子包(子文件夹)
    |---|---|---  __init__.py
    |---|---|---  子包模块1
    |---|---|---  子包模块2
    
  • 包的导入操作

    • import package_name

      • 直接导入一个包,可以使用__init__.py中的内容
      • 使用方式是:

        package_name.func_name
        package_name.class_name.func_name()

      • 此种方式的访问内容是
      • 案例 pkg01, p07.py
        # pkg01.__init__py
        def inInit():
            print("I am in init of package")
    
        # pkg01.p01.py
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
        
            def say(self):
                    print("My name is {0}".format(self.name))
        
            def sayHello():
                print("Hi, ")
    
    
        print("我是模块p01")
        # 案例 p07.py
        import pkg01
        
        pkg01.inInit()
        I am in init of package
    
    • import package_name as p

      • 具体用法跟作用方式,跟上述简单导入一致
      • 注意的是此种方法是默认对__init__.py内容的导入
    • import package.module

      • 导入包中某一个具体的模块
      • 使用方法

            package.module.func_name
            package.module.class.fun()
            package.module.class.var
      • 案例 p08.py
        # 案例 p08.py
        import pkg01.p01
        
        stu = pkg01.p01.Student()
        stu.say()
        我是模块p01
        My name is NoName
    
    • import package.module as pm
  • from ... import 导入

    • from package import module1, module2, module3, ... ...
    • 此种导入方法不执行 __init__ 的内容

      from pkg01 import p01
      p01.sayHello()
    • from package import *

      • 导入当前包 __init__.py 文件中所有的函数和类
      • 使用方法

        func_name()
        class_name.func_name()
        class_name.var

      • 案例 p09.py, 注意此种导入的具体内容
        # 案例 p09.py
        from pkg01 import *
        
        inInit()
        
        stu = Student() 
        I am in init of package
        
        NameError: name 'Student' is not defined
  • from package.module import *

    • 导入包中指定的模块的所有内容
    • 使用方法

      func_name()
      class_name.func_name()

  • 在开发环境中经常会引用其他模块,可以在当前包中直接导入其他模块中的内容

    • import 完整的包或者模块的路径
  • __all__ 的用法

    • 在使用from package import 的时候, 可以导入的内容
    • __init__.py 中如果文件为空,或者没有 __all__, 那么只可以把 __init__ 中的内容导入
    • __init__ 如果设置了 __all__ 的值,那么则按照 __all__ 指定的子包或者模块进行加载

    如此则不会载入 __init__ 中的内容

    • __all__=['module1', 'module2', 'package1'... ...]
    • 案例 pkg02,p10.py
        # pkg02.__init__.py
        __all__=['p01']
        
        def inInit():
            print("T am in init of package")
    
        # pkg02.p01.py
        class Student():
            def __init__(self, name = "NoName", age = 18):
                self.name = name
                self.age = age
    
            def say(self):
                print("My name is {0}".format(self.name))
        
            def sayHello():
                print("Hi, ")
        
        # 此判断语句建议一直作为程序的入口
        if __name__ == '__main__':
            print("我是模块p01")
        # 案例 p10.py
        from pkg02 import *
        
        stu = p01.Student()
        stu.say()
    My name is NoName

命名空间

  • 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
  • 作用是防止命名冲突

    setName()
    Student.setName()
    Dog.setName()

目录
相关文章
|
资源调度 算法 JavaScript
Python基础专题 - 超级详细的 Random(随机)原理解析与编程实践
Python基础专题 - 超级详细的 Random(随机)原理解析与编程实践
2073 0
|
算法 安全 JavaScript
通过Postman实现API网关的请求签名与调试
Postman是一个非常强大的HTTP发包测试工具, 目前Postman已经提供了Windows/Mac/Linux系统的客户端的下载,使用很方便。不过API网关的调试,需要对HTTP请求进行签名才能调用,无法使用简单的curl等发包工具完成,但我们可以使用Postman工具提供的Pre-request Script脚本来实现API网关的签名功能,实现API的调试功能。
7314 0
|
2月前
|
缓存 弹性计算 分布式计算
阿里云账号:计算型/通用型/内存型价格与场景区别
本文深度解析阿里云ECS三大主力实例:计算型(1:2)、通用型(1:4)、内存型(1:8)的硬件配比、适用场景与性价比逻辑。通过真实业务案例、价格测算与三步决策法,助企业告别“乱选配置”,精准匹配CPU与内存需求,避免资源浪费,实现降本增效。
|
6月前
|
人工智能 安全 机器人
拒绝浅层辅助,AI全流程研发的核心价值拆解
在研发效率内卷的当下,多数AI编程仍停留在“单点补全”的浅层阶段,而AI研发的深度体验,彻底打破了我对AI赋能研发的认知——它以环境、Git、AI任务、多模型、安全为核心,织就了一套闭环可落地的研发链路,将工程师从环境配置、重复编码等机械劳动中解放出来,让精力聚焦于真正创造价值的逻辑设计与需求拆解。
374 0
|
7月前
|
人工智能 运维 监控
2026年阿里云及本地搭建OpenClaw/Clawdbot实战指南:1分钟跑通5大自动化场景
2026年,OpenClaw(原Clawdbot、Moltbot)凭借“自主式工作流”特性,彻底颠覆了AI工具的使用逻辑——它不再是“问一句答一句”的交互式助手,而是能24小时后台运行、主动触发任务、跨端响应指令的“数字员工”。与Claude Code等传统大模型相比,OpenClaw的核心优势在于:持续在线、定时任务、主动推送、持久记忆、多端访问,真正实现“人只做创造性工作,系统包揽重复性劳动”。
847 4
|
机器学习/深度学习 C++
强化学习:实践理解Markov决策过程(MDP)(干中学系列)——手把手教你入门强化学习(三)
本博客以实践为主,带领读者巩固上期关于“Markov决策过程”的核心概念。通过构建学生马尔可夫奖励模型、计算收获值与状态价值,进一步验证贝尔曼方程。详细介绍了转移概率、奖励值及策略概率的设置,并实现了均匀随机策略下的状态价值计算与最优策略的价值评估。结合代码实例,帮助读者深入理解强化学习理论。适合初学者实践与进阶学习。
828 63
|
弹性计算 关系型数据库 数据库
快速体验Cloudberry和APCC
通过Docker快速体验Cloudberry和APCC
991 6
|
人工智能 Python
人工智能导论——谓词公式化为子句集详细步骤
在谓词逻辑中,有下述定义: 原子(atom)谓词公式是一个不能再分解的命题。 原子谓词公式及其否定,统称为文字(literal)。$P$称为正文字,$\neg P$称为负文字。$P$与$\neg P$为互补文字。 <font color="ddd0000">任何文字的析取式称为子句(clause)。任何文字本身也是子句。</font> 由子句构成的集合称为子句集。 不包含任何文字的子句称为空子句,表示为NIL。 <font color="ddd0000">由于空子句不含有文字,它不能被任何解释满足,所以,空子句是永假的、不可满足的。</font> 在谓词逻辑中,任何一个谓词公式都可以通过应用等
3014 1
人工智能导论——谓词公式化为子句集详细步骤
|
存储 数据可视化 数据挖掘
想提升电商业务效率?这 6 款团队协作软件千万别错过!
在电商旺季,订单量激增,团队需高效协调运营、营销、客服、物流等环节。可视化协作办公软件成为必备工具,提升业务效率与客户满意度。本文推荐6款优秀软件:板栗看板(国产)、Trello、Asana、Wrike、Monday.com和Basecamp。这些软件具备简洁易用的操作界面、强大的可视化功能、定制化任务管理及便捷的跨团队协作,帮助电商团队应对商品上架、促销推广、订单处理等挑战。J人主导的电商公司可根据自身需求选择最适配的工具,实现高效运营与业务增长。
644 16
|
运维 监控 Linux
zabbix中SNMP (Simple Network Management Protocol)
zabbix中SNMP (Simple Network Management Protocol)
896 10