16 模块

16.1 模块介绍

  • 有过C语言编程经验的朋友都知道在C语言中如果要引用sqrt函数,必须用语句#include 引入math.h这个头文件,否则是无法正常进行调用的,那么在Python中,如果要引用一些其他的函数,该怎么处理呢?
  • 在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一下Python中的模块
  • 说的通俗点:模块就好比是工具包,要想使用这个工具包中的工具(就好比函数),就需要导入这个模块。导入模块的方式有以下几种:
    • import 模块名
    • from 模块名 import 功能名
    • from 模块名 import *
    • import 模块名 as 别名
    • from 模块名 import 功能名 as 别名

16.2 模块导入方式

16.2.1 import

  • 在Python中用关键字import来引入某个模块,比如要引用模块math,就可以在文件最开始的地方用import math来引入
      import module1,mudule2...
    
  • 在调用math模块中的函数时,必须这样引用:
      模块名.函数名
    
  • 为什么必须加上模块名调用呢?

    • 因为可能存在这样一种情况:在多个模块中含有相同名称的函数,此时如果只是通过函数名来调用,解释器无法知道到底要调用哪个函数。所以如果像上述这样引入模块的时候,调用函数必须加上模块名

      import math
      
      #这样会报错
      print(sqrt(2))
      
      #这样才能正确输出结果
      print(math.sqrt(2))
      

16.2.2 from…import

  • 有时候我们只需要用到模块中的某个函数,只需要引入该函数即可,此时可以用下面方法实现:
      from 模块名 import 函数名1,函数名2....
    
  • 不仅可以引入函数,还可以引入一些全局变量、类等
  • 通过这种方式引入的时候,调用函数时只能给出函数名,不能给出模块名,但是当两个模块中含有相同名称函数的时候,后面一次引入会覆盖前一次引入。也就是说假如模块A中有函数function( ),在模块B中也有函数function( ),如果引入A中的function在先、B中的function在后,那么当调用function函数的时候,是去执行模块B中的function函数

      # 模块1代码
      def my_test(a, b):
          print(a + b)
    
      # 模块2代码
      def my_test(a, b):
          print(a - b)
    
      # 导入模块和调用功能代码
      from my_module1 import my_test
      from my_module2 import my_test
    
      # my_test函数是模块2中的函数
      my_test(1, 1)
    

16.2.3 from … import *

  • 把一个模块的所有内容全都导入到当前的命名空间也是可行的,只需使用如下声明:
      from modname import *
    
  • 这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用

16.2.4 import 模块名 as 别名

  • import 模块名 as 别名叫做模块别名,就是把原来模块的名称改成自己想要的名称,模块改名字后原来的模块名会失效
      # 1. 模块别名
      import time as tt
      tt.sleep(2)
      # time.sleep(2) # NameError: name 'time' is not defined
      print('hello')
    

16.2.5 from 模块名 import 功能名 as 别名

  • from 模块名 import 功能名 as 别名叫做功能别名,就是把原来功能的名称改成自己想要的名称,功能改名字后原来的功能名会失效
      # 2. 功能别名
      from time import sleep as sl
      sl(2)
      # sleep(2) # NameError: name 'sleep' is not defined
      print('hello')
    

16.3 模块制作

16.3.1 自定义模块

  • 在Python中,每个Python文件都可以作为一个模块,模块的名字就是文件的名字,比如在test.py中定义了函数add
      def add(a,b):
          return a+b
    

16.3.2 调用自定义模块

  • 在其他文件中就可以先import test,然后通过test.add(a,b)来调用了,当然也可以通过from test import add来引入

      import test
    
      result = test.add(11,22)
      print(result)
    

16.3.2 测试模块

  • 在实际开中,当一个开发人员编写完一个模块后,为了让模块能够在项目中达到想要的效果,这个开发人员会自行在py文件中添加一些测试信息

      def add(a,b):
          return a+b
    
      # 用来进行测试
      ret = add(12,22)
      print('int test.py file,,,,12+22=%d'%ret)
    
      import test
    
      result = test.add(11,22)
      print(result)
    
      int test.py file,,,,12+22=34
      33
    
    • 可发现test.py被引用后,里面的测试代码也会被执行。而我们的目的应该是单独执行test.py文件时才应该执行的,不应该是其他的文件中引用而执行
  • 为了解决这个问题,python在执行一个文件时有个变量__name__,可以根据__name__变量的结果能够判断出,是直接执行的python脚本还是被引入执行的,从而能够有选择性的执行测试代码

    • 直接运行此文件

      图 12

    • 在其他文件中import此文件

      图 13

    • 根据__name__变量的结果能够判断

      图 14

16.4 __all__

  • 没有__all__

    图 15

    图 16

    图 17

  • __all__

    图 18

    图 19

  • 总结:如果一个文件中有__all__变量,那么也就意味着不在这个变量中的元素,不会被from xxx import *时导入

16.5 包

  • 包将有联系的模块组织在一起,即放到同一个文件夹下,并且在这个文件夹创建一个名字为__init__.py 文件,那么这个文件夹就称之为包

16.5.1 制作包

  • New → Python Package → 输入包名 → OK → 新建功能模块(有联系的模块)
  • 注意:新建包后,包内部会自动创建__init__.py文件,这个文件控制着包的导入行为
  • 新建包mypackage → 新建包内模块:my_module1 和 my_module2

      # my_module1
      print(1)
    
      def info_print1():
          print('my_module1')
    
      # my_module2
      print(2)
    
      def info_print2():
          print('my_module2')
    

16.5.2 导入包

  • 方法一

      import 包名.模块名
    
      包名.模块名.目标
    
      import my_package.my_module1
    
      my_package.my_module1.info_print1()
    
  • 方法二

      from 包名 import *
      模块名.目标
    
      from my_package import *
    
      my_module1.info_print1()
    
    • 注意:必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表

results matching ""

    No results matching ""