Python高级语法——包

本文详细介绍了Python中的模块和包的概念与使用。模块是包含Python代码的.py文件,用于代码拆分和复用。包是组织模块的文件夹,提供更高级的命名空间管理。模块的搜索路径包括系统默认路径和sys.path动态添加的路径。导入模块有多种方式,如import module_name,from module import *等。命名空间用于避免命名冲突,确保函数和变量的唯一性。
摘要由CSDN通过智能技术生成

1. 模块

  • 一个模块就是一个包含python代码的文件,后缀名是.py就可以,模块就是个python文件
  • 为什么用模块
    • 程序太大,编写维护非常不便,需要拆分
    • 模块可以增加代码重复利用的方式
    • 当做命名空间使用,避免命名冲突
  • 如何定义模块
    • 模块就是一个普通文件,所以任何代码可以直接书写

    • 不过根据模块的规范,最好在模块中编写一下内容

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

      • 模块直接导入
        • 假如模块名称直接以数字开头,需要借助importlib帮助
      • 语法
        import module_name
        module_name.function_name
        module_name.class_name
      • 案列 python_advanced_01.py, python_advanced_02.py
      #python_advanced_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("欢迎来到这里!")
      print("我是模块01.")
      
      #python_advanced_02.py
      import python_advanced_01
      student = python_advanced_01.Student()
      student.say()
      python_advanced_01.sayHello()
      
      '''
      输出结果:
      我是模块01.
      My name is noname
      欢迎来到这里!
      '''
      
      • import 模块 as 别名
        • 导入的同时给模块起一个别名
        • 其余用法跟第一种相似
        • 案例 python_advanced_03.py
        # python_advanced_03.py
        import python_advanced_01 as p
        student = p.Student("abby", 20)
        student.say()
        p.sayHello()
        
        '''
        输出结果:
        我是模块01.
        My name is abby
        欢迎来到这里!
        '''
        
  • from module import class_name, func_name
    • 按上述方法有选择性导入
    • 使用的时候可以直接使用导入的内容,不需要前缀
    • 案例 python_advanced_04.py
    # python_advanced_04.py
    from python_advanced_01 import Student, sayHello
    stu = Student("Jack", 30)
    stu.say()
    sayHello()
    
    
    '''
    我是模块01.
    My name is Jack
    欢迎来到这里!
    '''
    
  • from module import *
    • 导入模块所有内容
    • 案例 python_advanced_05.py
    # python_advanced_05.py
    from python_advanced_01 import *
    sayHello()
    stu = Student("Jason", 35)
    stu.say()
    '''
    输出结果:
    我是模块01.
    欢迎来到这里!
    My name is Jason
    '''
    
  • if __name__ == '__main__' 的使用
    • 可以有效避免模块代码被导入的时候被动执行的问题
    • 建议所有程序的入口都已此代码为入口
#此判断语句建议一直作为程序入口
if __name__ == '__main__':
    print("我是模块01.")

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

  • 什么是模块的搜索路径
    • 加载模块的时候,系统会在哪些地方寻找此模块
  • 系统默认的模块搜索路径
    import sys
    sys.path 属性可以获取路径列表
    #案例 python_advanced_06.py
    #python_advanced_06.py
    import sys
    print(type(sys.path))
    for p in sys.path:
        print(p)
    '''
    输出结果:
    <class 'list'>
    D:\python practice\basic_practice\practice
    D:\python practice\basic_practice
    D:\python practice\basic_practice\venv\Scripts\python37.zip
    D:\python\DLLs
    D:\python\lib
    D:\python
    D:\python practice\basic_practice\venv
    D:\python practice\basic_practice\venv\lib\site-packages
    D:\python practice\basic_practice\venv\lib\site-packages\setuptools-40.8.0-py3.7.egg
    D:\python practice\basic_practice\venv\lib\site-packages\pip-19.0.3-py3.7.egg
    '''
    
  • 添加搜索路径
    sys.path.append(dir)
  • 模块的加载顺序
    1. 搜索内存中已经加载好的模块
    2. 搜索python的内置模块
    3. 搜索sys.path路径

3. 包

  • 包是一种组织管理代码的方式,包里面存放的是模块

  • 用于将模块包含在一起的文件夹就是包

  • 自定义包的结构
    /--- 包
    /---/---__init__.py 包的标志文件
    /---/--- 模块1
    /---/--- 模块2
    /---/--- 子包(子文件夹)
    /---/---/---__init___.py 包的标志文件
    /---/---/--- 子包模块1
    /---/---/--- 子包模块2

  • 包的导入

    • import package_name

      • 直接导入一个包,可以使用__init__中的内容
      • 使用方式是:
        package_name.func_name
        package_name.class_name.func_name()
    • import package_name as alias

      • 具体用法跟作用方式,跟上述简单导入一致
      • 注意的是此种方法是默认对__init__.py内容的导入
      • 案例 如下:
      #package pkg01的__init__.py文件
      def inInit():
          print("I am in inInit function.")
      
      #python_advanced_07.py
      import pkg01
      pkg01.inInit()
      '''
      输出结果:
      I am in inInit function.
      '''
      
    • import package.module

      • 导入包中具体某一个模块
      • 使用方法:
        package.module.func_name
        package.module.class_name.fun()
        package.module.class_name.var
      • 案例 python_advanced_08.py
      #package pkg01下面的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("欢迎来到这里!")
      
      
      print("我是模块01.")
      
      #python_advanced_08.py
      import pkg01.p01
      
      stu = pkg01.p01.Student()
      stu.say()
      pkg01.p01.sayHello()
      
      '''
      输出结果:
      我是模块01.
      My name is noname
      欢迎来到这里!
      '''
      
    • import package.module as alias

  • from … import 导入

    • from package import module1, module2, module3
      • 此种导入方法不执行__init__ 的内容
      • 案例 python_advanced_09.py
      #python_advanced_09.py
      from pkg01 import p01
      
      stu = p01.Student("Abby",18)
      stu.say()
      p01.sayHello()
      pkg01.inInit()
      
      '''
      输出结果:
      Traceback (most recent call last):
        File "D:/python practice/basic_practice/practice/python_advanced_09.py", line 7, in <module>
          pkg01.inInit()
      NameError: name 'pkg01' is not defined
      我是模块01.
      My name is Abby
      欢迎来到这里!
      '''
      
    • from package import *
      • 导入当前包__init__.py 文件中所有的函数和类

      • 使用方法:
        func_name()
        class_name.func_name()
        class_name.var

      • 案例 python_advanced_10.py, 注意此种导入的具体内容

      #python_advanced_10.py
      from pkg01 import *
      
      inInit()
      stu = Student("Abby",18)
      stu.say()
      sayHello()
      '''
      输出结果:
      Traceback (most recent call last):
        File "D:/python practice/basic_practice/practice/python_advanced_10.py", line 5, in <module>
          stu = Student("Abby",18)
      NameError: name 'Student' is not defined
      I am in inInit function.
      '''
      
    • from package.module import *
      • 导入包中指定的模块的所有内容
      • 使用方法:
        func_name()
        class_name.fun()
    • 在开发环境中经常会用到其他模块,可以在当前包中直接导入其他模块中的内容
      • import 完整的包或者模块的路径
    • __all__ 的用法
      • 在使用from package import * 的时候,* 可以导入的内容
      • __init__.py 中,如果文件为空,或者没有__all__的时候,那么只可以把__init__ 中的内容导入,即导入空内容.
      • __inin__ 如果设置了__all__ 的值,那么则按照__all__指定的子包或者模块进行载入,不会载入__init__中的其它内容
      • __all__= ['module1', 'module2', 'package1'......]
      #python_advanced_11.py
      from pkg02 import *
      
      stu = p01.Student("Abby",18)
      stu.say()
      p01.sayHello()
      inInit()
      '''
      输出结果:
      我是模块01.
      My name is Abby
      欢迎来到这里!
      Traceback (most recent call last):
        File "D:/python practice/basic_practice/practice/python_advanced_11.py", line 7, in <module>
          inInit()
      NameError: name 'inInit' is not defined
      '''
      

4. 命名空间

  • 用以区分不同位置,不同功能,但相同名称的函数或者变量的一个特定前缀
  • 作用是防止命名冲突
    setName()
    Student.setName()
    Dog.setName()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值