博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python_基于反射模拟Web框架路由系统
阅读量:5138 次
发布时间:2019-06-13

本文共 2897 字,大约阅读时间需要 9 分钟。

  • 根据用户输入的内容,导入模块
#根据用户输入的内容,导入模块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.py19 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/nb30 牛逼网页
方法一
  • 方法二目录结构如下:

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_order17 添加订单
再进一步优化方法三
  •  利用反射查看面向对象成员归属
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 = name12         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 = name10 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)

 

转载于:https://www.cnblogs.com/yinjia/p/8605663.html

你可能感兴趣的文章
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
【luogu4185】 [USACO18JAN]MooTube [并查集]
查看>>
手机号脱敏处理
查看>>
CI控制器调用内部方法并载入相应模板的做法
查看>>
Hdu - 1002 - A + B Problem II
查看>>
HDU - 2609 - How many
查看>>
每天CookBook之Python-003
查看>>
每天CookBook之Python-004
查看>>
Android设置Gmail邮箱
查看>>
StringBuffer的用法
查看>>
js编写时间选择框
查看>>
PHP压缩文件操作
查看>>
Java数据结构和算法(四)--链表
查看>>
JIRA
查看>>
小技巧——直接在目录中输入cmd然后就打开cmd命令窗口
查看>>
深浅拷贝(十四)
查看>>
由级别和性格特征将程序员分类 ---看看你属于哪一种
查看>>
HDU 6370(并查集)
查看>>