zoukankan      html  css  js  c++  java
  • 通过字符串导入、调用

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

      电影论坛模拟程序:

    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

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

  • 相关阅读:
    【读书笔记】Expert Oracle Architecture (by Tom) (2)
    【读书笔记】Introducing ASP.NET
    【读书笔记】Expert Oracle Architecture (by Tom) (1)
    【原创】ASP.NET学习(3)
    【原创】XSL 学习(1)
    【原创】也谈“异步”响应
    【读书笔记】ASP.NET State Management
    基础算法之枚举
    基础算法之排序查找算法
    开放内网(转)
  • 原文地址:https://www.cnblogs.com/cdinc/p/5850286.html
Copyright © 2011-2022 走看看