• 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)
  • 相关阅读:
    基于redis集群实现的分布式锁,可用于秒杀商品的库存数量管理,有測试代码(何志雄)
    VC断点失败的原因之中的一个
    由易到难学习递归的精华
    【特征检測】BRIEF特征点描写叙述算法
    POJ 2386 Lake Counting
    Design Pattern 设计模式1
    使用 InstallShield 制作 Delphi 软件安装包
    在64位系统上部署BDE的要点
    SQL SERVER 存储过程中SELECT 返回值如何赋值给变量
    sql语句中的insert 和 insert into 的区别?into有什么用?
  • 原文地址:https://www.cnblogs.com/yinjia/p/8605663.html
Copyright © 2020-2023  润新知