Python动态导入模块和反射机制详解

  

一、前言

  

何谓动态导入模块,就是说模块的导入可以根据我们的需求动态的去导入,不是像一般的在代码文件开头固定的导入所需的模块。

  

何谓反射机制,利用字符串的形式在模块或对象中操作(查找/获?删除/添加)成员。

  

下面进入具体实例介绍环节。先创建一个示例文件example.py,简单写入几个加减乘除函数,如下,方便下文讲解使用。

        标志=1 #此变量在介绍反射机制时会用的到      def my_sum (a, b):      返回一个+ b      def my_sub (a, b):      返回一个- b      

二、动态导入模块

  

一般,如果我们想从其他文件引用上面的几个函数方法,都会如下使用:

        进口为例计算      #加法   和=计数。my_sum (2、3)      #减法   子=计数。my_sub (2)      打印(“总和:{},子:{}”。格式(和,子)      

但现在有这样的需求,我需要动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?看下面。

        小鬼=输入(“请输入你需要导入的模块名称:")   数=__import__ (imp) #这种方式就是通过输入字符串导入你想导入的模块      #加法   和=计数。my_sum (2、3)      #减法   子=计数。my_sub (2)      打印(“总和:{},子:{}”。格式(和,子)      

上面实现了动态输入模块名,从而使我们能够导入模块并且执行里面的函数。但是上面有一个缺点,那就是执行的函数被固定了。那么,我们能不能改进一下,动态输入函数名,并且来执行呢?看下面。

        小鬼=输入(“请输入你需要导入的模块名称:")   数=__import__ (imp)      func=输入(“请输入你需要使用的函数名:”)      f=getattr(计数函数,没有)      #加法   和=f (2,3)   打印(总和)      

getattr()方法的作用是:从导入的模块中找到你需要调用的函数函数,然后返回一个该函数的引用,没有找到就烦会没有。

  

这样我们就实现了,动态导入一个模块,并且动态输入函数名然后执行相应方法。

  

不过,上面还存在一点点小问题:那就是我们的模块有可能不是在本级目录中存放着,有可能是如下图存放方式:

  

 Python动态导入模块和反射机制详解

  

那怎么办呢?看下面。

        小鬼=输入(“请输入你想导入的模块名称:")   数=__import__ (“first_level。{}”.format (imp) fromlist=True)      有趣=输入(“请输入你想要使用的函数名:”)      f=getattr(计数,有趣,没有)      #加法   和=f (2,3)   打印(总和)      

三,反射机制(又叫python自省)

  

我们先来介绍python的四个内置函数:

  

1。getattr ()

  

这个函数是Python自省的核心函数,具体使用上面已经介绍了,她不仅可以用于在模块中查找获取相应的方法和变量,也可以在一个对象中查找和获取相应的方法和变量,这里就不距离介绍了。

  

2, hasattr(对象名称)

  

判断模块(或对象对象)是否包含名为名字的方法或变量(hasattr是通过调用getattr(物质、名称)是否抛出异常来实现的)

        小鬼=输入(“请输入你想导入的模块名称:")   数=__import__ (“first_level。{}”.format (imp) fromlist=True)      打印(hasattr(统计,“my_sum”)) #判断模块计算中是否存在my_sum方法,存在返回真正的      

3, setattr(对象、名称、值)

  

这是相对应的getattr()。参数是一个对象,一个字符串和一个任意值。字符串名字可以是对象(对象)中一个现有的属性或一个新的属性,这个函数将值(值)赋给属性(名字)的。使用示例,setattr (x, y, v)相当于x。y=v .

        小鬼=输入(“请输入你想导入的模块名称:")   数=__import__ (“first_level。{}”.format (imp) fromlist=True)      setattr(统计,“国旗”,0)#即使例子模块中没有国旗变量,此处也成立,没有的话相当于给模块中新增一个变量国旗      打印(count.flag) #打印出标志的值为0      

4, delattr(对象名称)

Python动态导入模块和反射机制详解