zoukankan      html  css  js  c++  java
  • python_基于反射模拟Web框架路由系统

    • 根据用户输入的内容,导入模块
    #根据用户输入的内容,导入模块
    inp = input("请输入模块名: ")
    print(inp,type(inp))
    
    dd = __import__(inp)
    r = dd.f1()
    print(r)
    
    inp = input('请输入模块:')
    inp_func = input('请输入要执行的函数:')
    
    #_-import__用于以字符串的形式导入模块
    dd = __import__(inp)
    • 以字符串的形式去某个模块中寻找函数
     1 #getattr 用于以字符串的形式去某个模块中寻找函数
     2 target_func =  getattr(dd,inp_func,None)
     3 #在获取到的函数名后加()表示执行函数
     4 #result = target_func()
     5 print( target_func)
     6 
     7 import commo
     8 
     9 #判断函数是否存在
    10 r = hasattr(commo,'AGE')
    11 print(r)
    12 
    13 #设置函数
    14 setattr(commo,'AGE',lambda a:a+1)
    15 r = hasattr(commo,'AGE')
    16 print(r)
    17 
    18 #删除成员
    19 delattr(commo,'NAME')
    20 r = hasattr(commo,'NAME')
    21 print(r)
    • 导入模块扩展方法:

    方法1、import 模块

    方法2、a = __import__(“模块名”)

    方法3、 a = __import__(‘lib.test.com’,fromlist=True)

    方法举例:

     1 #index.py
     2 from lib import account
     3 
     4 url = input("请输入url: ")
     5 if url.endswith("login"):
     6     a = account.login()
     7     print(a)
     8 elif url.endswith('logout'):
     9     b = account.logout()
    10     print(b)
    11 elif url.endswith('nb'):
    12     c = account.nb()
    13     print(c)
    14 else:
    15     print("404")
    16 
    17 
    18 #account.py
    19 def login():
    20     return "login"
    21 
    22 def logout():
    23     return "logout"
    24 
    25 def nb():
    26     return "牛逼网页"
    27 
    28 输出结果:
    29 请输入url: www.hao.com/nb
    30 牛逼网页
    方法一
    • 方法二目录结构如下:

    1 url = input("请输入url: ")
    2 inp = url.split('/')[-1]
    3 if hasattr(account,inp):
    4     target_func = getattr(account,inp)
    5     r = target_func()
    6     print(r)
    7 else:
    8     print('404')
    进一步优化方法二
    • 方法三目录结构,多模块目录结构情况下进行动态导入模块,如下:

     1 #模块名/函数名
     2 url = input("请输入url: ")
     3 
     4 target_module,target_func = url.split('/')
     5 m = __import__("lib." + target_module,fromlist=True)
     6 
     7 if hasattr(m,target_func):
     8     target_func = getattr(m,target_func)
     9     r = target_func()
    10     print(r)
    11 else:
    12     print('404')
    13 
    14 
    15 输出结果:
    16 请输入url: order/add_order
    17 添加订单
    再进一步优化方法三
    •  利用反射查看面向对象成员归属
     1 class Annimal:
     2     def __init__(self):
     3         print("父类构造方法")
     4         self.ty = "动物"
     5     def eat(self):
     6         print("%s%s在吃东西" % (self.name,self.n))
     7 
     8 class Cat(Annimal):
     9     def __init__(self,name):
    10         print("子类构造方法")
    11         self.name = name
    12         self.n = ""
    13         super(Cat,self).__init__() #常用第一种方法,执行父类初始化数据
    14         #Annimal.__init__(self) #第二种方法
    15 
    16 #数据初始化
    17 c = Cat("张三的")
    18 c.eat()
    19 print(c.__dict__)
    20 
    21 #反射:对象,即可以找对象,又可以找类的成员
    22 r1 = hasattr(c,'eat')
    23 print(r1)
    24 r2 = hasattr(c,'name')
    25 print(r2)
    • 利用反射导入模块、查找类、创建对象、查找对象中的成员
     1 #!/usr/bin/env python
     2 #coding=utf-8
     3 __author__ = 'yinjia'
     4 
     5 #test3.py
     6 class Foo:
     7     def __init__(self,name):
     8         temp = "xxx"
     9         self.name = name
    10 
    11     def show(self):
    12         print('show')
     1 #!/usr/bin/env python
     2 #coding=utf-8
     3 __author__ = 'yinjia'
     4 
     5 #test4.py
     6 #导入模块
     7 m = __import__("test3",fromlist=True)
     8 
     9 #去模块中找类
    10 class_name = getattr(m,"Foo")
    11 
    12 #根据类创建对象
    13 obj = class_name("Yinjia")
    14 
    15 #去对象中找name对应的值
    16 val = getattr(obj,'name')
    17 print(val)
  • 相关阅读:
    CSRF的安全问题
    preg_replace
    反汇编:虚函数表
    12.Proxy
    JS中的this
    11.Set 和 Map数据结构
    10.symbol
    9.对象的扩展
    test
    ES5支持的方法
  • 原文地址:https://www.cnblogs.com/yinjia/p/8605663.html
Copyright © 2011-2022 走看看