美文网首页
python进阶 第一天 反射

python进阶 第一天 反射

作者: xinmin | 来源:发表于2018-09-23 16:40 被阅读0次
    • 反射
      通过字符串的形式导入模块,
      通过字符串的形式去模块中寻找指定函数,全局变量,并执行
      根据字符串的形式去某个模块中寻找东西
      总结:根据字符串的形式去某个对象(某个模块)中操作成员
      # import commons
      # getattr 用于以字符串的形式导入模块
      inp = input("请输入要导入的模块:")
      dd = __import__(inp)
      inp_func = input("请输入要执行的函数:")
      # r = commons.f1()
      target_func = getattr(dd, inp_func)
      result = target_func() # 执行函数
      print(result) 
      
      # commons.py 模块
      NAME = "xinmin"
      def f1():
          return "F1"
      def f2():
          return "F2"
      def f3():
          return "F3"
      
      import commons
      # 第三个参数表示没找到的时候的默认返回值
      target_func = getattr(commons, "f1", None)
      # 判断是否存在
      r = hasattr(commons, "NAME")
      print(r) # True
      # 在内存中为模块添加东西(全局变量,函数)
      setattr(commons, "AGE", 18)
      # 在内存中出删除模块中的东西,不影响源文件
      delattr(commons, "f2")
      
      # 导入模块
      import commons
      # dd = __import__("commons")
      # 嵌套关系
      import lib.test.com
      # from lib.test import com
      # fromlist = True 去找模块
      # r = __import__("lib.test.com", fromlist = True)
      # print(r) 
      
      # 反射小案列
      # account.py模块
      def login():
          return "login"
      def logout():
          return "logout"
      def nb():
          return "特别牛逼的页面"
      # ================================================
      # index.py 模块
      # 版本一
      """
      from lib import account
      url = input("请输入url:")
      if url.endswith("login"):
          r = account.login()
          print(r)
      elif url.endswith("logout"):
          r = account.logout()
          print(r)
      elif url.endswith("nb"):
          r = account.nb()
          print(r)
      else:
          print("404")
      """
      # 版本二
      """
      from lib import account
      url = input("请输入url:")
      # 使用反射简化if-else的应用
      inp = url.split("/")[-1]
      if hasattr(account, inp):
          target_func = getattr(account, inp)
          r = target_func()
          print(r)
      else:
          print("404")
      """
      # 版本三
      # 模块名/函数名
      # account/login
      url = input("请输入url:")
      target_module, target_func = url.split("/")
      m = __import__("lib." + target_module, fromlist=True)
      if hasattr(m, target_func):
          target_func = getattr(m, target_func)
          r = target_func()
          print(r)
      else:
          print("404")
      

    相关文章

      网友评论

          本文标题:python进阶 第一天 反射

          本文链接:https://www.haomeiwen.com/subject/prsonftx.html