通过字符串导入调用

Posted cos1eqlg0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过字符串导入调用相关的知识,希望对你有一定的参考价值。

  我们总能遇到需要导入多个模块的时候,但是真实使用的时候却没有用到那么多,比如下面的程序,根据不同的输入访问不同的论坛。

  电影论坛模拟程序:

def login():
    print(\'您已进入电影模块。\')

def code():
    print(\'Doing something about film forum...\')
View Code

  音乐论坛模拟程序:

def login():
    print(\'您已进入音乐模块。\')

def code():
    print(\'Doing something about music forum...\')
View Code

  主程序模拟程序:

import film
import music

link=input(\'您想进入的论坛是:\')
if link==\'film\':
    film.login()
    film.code()
elif link==\'music\':
    music.login()
    music.code()
else:
    print(\'输入错误。\')
View Code

   运行结果是:

您想进入的论坛是:film
您已进入电影模块。
Doing something about film forum...

您想进入的论坛是:music
您已进入音乐模块。
Doing something about music forum...
View Code

  可以看到,我们只是访问一个论坛,但是却不得不导入两个模块,如果有一千个、一万个论坛那将是噩梦。那有没有方法能够根据输入的内容导入不同的模块呢?答案是能。请看下面的程序(电影论坛模拟程序和音乐论坛模拟程序没有变化,直接使用了)。

link=input(\'您想进入的论坛是:\')

model=__import__(link)

if hasattr(model,\'login\') and hasattr(model,\'code\'):
    login=getattr(model,\'login\')
    login()
    code=getattr(model,\'code\')
    code()
else:
    print(\'输入错误。\')
View Code

  这里我们根据字符串导入模块,执行方法。

  __import__(link)的意思是根据link的字符串导入模块。

  hasattr(model,\'login\')是判断导入的模块中有没有指定方法,如果有则为真,否则为假。

  getattr(model,\'login\')返回模块的内存地址,之后根据这个内存地址进行调用。

  运行结果是:

您想进入的论坛是:film
您已进入电影模块。
Doing something about film forum...

您想进入的论坛是:music
您已进入音乐模块。
Doing something about music forum...
View Code

  可以看到,执行结果与没有使用这种方法的时候执行结果相同,但是如果有一千个、一万个论坛的时候,这个方法的有点就显现出来了,节省了大量的代码量。

  然而,每一种方法都不是全能的,这种方法也有不好的一面。如果使用第一种方法,程序出现问题能够很容易找出出错点在什么地方,但是这种方法因为将多个模块、方法的调用整合在一起,所以出现错误时不容易排错。

  PS:如果最终模块路径比较深怎么办?那就再继续使用getattr就好了。

  请看一下例子,以下的例子中将论坛模拟程序放在了包文件logic中,那么它们的访问就会变成下面的样子。

link=input(\'您想进入的论坛是:\')

array=link.split(\'/\')
userspance=__import__(\'%s.%s\'%(array[0],array[1]))
model=getattr(userspance,array[1])
func=getattr(model,array[2])
func()
View Code

  运行结果是:

请输入网址:logic/film/login
您已进入电影模块。

请输入网址:logic/music/code
Doing something about music forum...
View Code

  其它多层的访问也是这样,可以根据具体情况进行变更。

以上是关于通过字符串导入调用的主要内容,如果未能解决你的问题,请参考以下文章

Python如何调用别人写好的脚本

怎么通过程序控制unity3d人物动作

无法通过接口获取与片段通信的活动

片段通信问题(尝试调用虚方法)

通过 Java 正则表达式提取 semver 版本字符串的片段

通过调用 popBackStackImmediate 返回到 tablayout 中的替换片段时调用哪个方法