zoukankan      html  css  js  c++  java
  • 第九章、包

    第九章、包

    一、什么是包

    包就是模块的一种形式,包的本质就是含有.py文件的文件夹,还有__init__文件,必须有这个文件,否则就是普通的文件夹

    二、为什么要有包

    ​ 模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理、维护会越来越复杂,因此我们可以使用包来扩展模块的功能。

    三、如何用包

    1. 模块和包

      导入模块发生的三件事:

      1. 创建一个包的名称空间

      2. 执行py文件,将执行过程中产生的名字存放于名称空间中。

      3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的

      导入包发生的三件事:

      1. 创建一个包的名称空间
      2. 由于包是一个文件夹,无法执行包,因此执行包下的.py文件,将执行过程中产生的名字存放于包名称空间中(即包名称空间中存放的名字都是来自于.py)
      3. 在当前执行文件中拿到一个名字aaa,aaa是指向包的名称空间的
    2. 扩展模块功能

      ​ 如下我们如果需要扩展aaa.py模块,需要建立一个aaa的目录文件,并且删除aaa.py文件,将aaa.py修改成m1.py和m2.py两个文件,让模块的功能使用方法不改变。

      # aaa.py
      
      def func1():
          pass
      
      def func2():
          pass
      
      def func3():
          pass
      
      def func4():
          pass
      
      def func5():
          pass
      
      def func6():
          pass
      
      # m1.py
      
      def func1():
          pass
      
      def func2():
          pass
      
      def func3():
          pass
      
      # m2.py
      
      def func4():
          pass
      
      def func5():
          pass
      
      def func6():
          pass
      
      # run.py
      
      import aaa
      
      aaa.func1()
      aaa.func2()
      aaa.func3()
      aaa.func4()
      aaa.func5()
      aaa.func6()
      
    3. 修改__init__文件

      # aaa.py
      
      func1 = 111
      func2 = 222
      func3 = 333
      func4 = 444
      func5 = 555
      func6 = 666
      

      由于在__init__.py中定义了func1,因此我们可以在run.py文件中导入func1,但是这个func1并不是我们想要的func1,因此需要修改__init__.py文件,又由于执行文件run.py的环境变量不为aaa,因此直接使用import导入m1会报错,因此使用from导入。

      # aaa/.py
      
      from aaa.m1 import func1
      from aaa.m2 import func2
      
      # run.py
      
      import aaa
      
      
      print(aaa.func1())
      print(aaa.func2())
      
    4. 导入包内包

    5. aaa.bbb指向aaa内部的文件夹bbb包,如果我们需要导入bbb这个包。

      # bbb/.py
      
      from aaa import bbb
      
      # run.py
      
      import aaa
      
      
      print(aaa.bbb)
      
    6. 导入包内包的模块

      # bbb/.py
      
      from aaa.bbb import m3
      # run.py
      
      import aaa
      
      
      aaa.bbb.m3
      
    7. 绝对导入和相对导入

      绝对导入

      # aaa/.py
      
      from aaa.m1 import func1
      from aaa.m2 import func2
      

      相对导入

      • .代表当前被导入文件所在的文件夹
      • ..代表当前被导入文件所在的文件夹的上一级
      • ...代表当前被导入文件所在的文件夹的上一级的上一级
      from .m1 import func1
      from .m2 import func2
      

    四、注意事项

    1. 包内所有的文件都是被导入使用的,而不是被直接运行的

    2. 包内部模块之间的导入可以使用绝对导入(以包的根目录为基准)与相对导入(以当前被导入的模块所在的目录为基准),推荐使用相对导入

    3. 当文件是执行文件时,无法在该文件内用相对导入的语法,只有在文件时被当作模块导入时,该文件内才能使用相对导入的语法

    4. 凡是在导入时带点的,点的左边都必须是一个包,import aaa.bbb.m3.f3错误

      如图

    5. 65包-目录结构.jpg?x-oss-process=style/watermark

      最多只能import aaa.bbb.m3

  • 相关阅读:
    DGA域名可以是色情网站域名
    使用cloudflare加速你的网站隐藏你的网站IP
    167. Two Sum II
    leetcode 563. Binary Tree Tilt
    python 多线程
    leetcode 404. Sum of Left Leaves
    leetcode 100. Same Tree
    leetcode 383. Ransom Note
    leetcode 122. Best Time to Buy and Sell Stock II
    天津Uber优步司机奖励政策(12月28日到12月29日)
  • 原文地址:https://www.cnblogs.com/demiao/p/11366539.html
Copyright © 2011-2022 走看看