python中反射4种方法的基本使用,python的反射机制
0x00前言
定义f1():
打印(“f1”)
定义f2():
打印( f2 )
def f3():
打印( f3 )
def f4():
打印( f4 )
a=1test.py
将测试作为ss导入
不锈钢f1()
不锈钢f2()
Print(ss.a)我们想导入另一个模块,可以用import。现在,有这样的需求。我可以动态输入一个模块名,我可以随时访问导入模块中的方法或变量。我该怎么办?
Imp=input("请输入要导入的模块的名称:")
CC=__import__(imp)这种方式是通过输入一个字符串来导入你想要导入的模块。
CC.f1() #我们在执行模块中的f1方法上面实现了模块名的动态输入,这样就可以输入模块名,执行里面的函数。但是上面有一个缺点,就是执行的功能是固定的。那么,是否可以通过动态输入函数名并执行来改善呢?
#动态. py
Imp=input(请输入模块:)
dd=__import__(imp)
#相当于进口imp
Inp_func=input(请输入要执行的函数:)
F=getattr(dd,inp_func,None)# func:从导入模块中找到你需要调用的函数inp_func,然后返回这个函数的一个引用。没找到,就一个都不烦。
F() #执行这个函数
我们实现了上面的,动态导入一个模块,动态输入函数名然后执行相应的函数。
当然,上面有一个小问题:我的模块名可能没有存储在本地目录中。它可以用以下方式储存:
那么我们如何处理这种方式呢?请看下面的代码:
DD=_ _ import _ _( lib . text . commons )#这只导入lib模块。
DD=_ _ import _ _( lib . text . commons ,fromlist=true) #使用此方法可以成功导入。
#相当于导入配置
Inp_func=input(请输入要执行的函数:)
f=getattr(dd,inp_func)
f()
0x01反射机制说了这么多。反射机制到底是什么?
实际上,反射是以字符串的形式导入模块;以字符串的形式,转到模块找到指定的函数并执行它。使用字符串形式操作(查找/获取/删除/添加)对象(模块)中的成员,一种基于字符串的事件驱动!
我们先介绍四个内置函数:
1.getattr()函数是Python内省的核心函数。其具体用途一般如下:
A类:
def __init__(self):
self.name=张静
#self.age=24
定义方法(自身):
打印“方法打印”
实例=A()
Getattr (Instance, name, not find) #如果实例对象中有属性名,则打印self.name的值,否则打印 not find
Getattr (Instance, age , not find) #如果实例对象中有属性age,则打印self.age的值,否则,打印 not find
Getattr (a, method , default) #如果有method方法,则打印其地址,否则打印default。
Printattr (a, method , default) () #如果有method方法,运行该函数并打印None或打印default
2.hasattr(对象,名称)
注意:判断object对象是否包含名为name的属性(hasattr是通过调用getattr(ojbect,name)抛出异常实现的)
3.setattr(对象,名称,值)
这是对应的getattr()。参数是一个对象、一个字符串和一个任意值。该字符串可以列出现有属性或新属性。这个函式会将值指派给属性的。这个对象允许它提供。例如,setattr (x," foobar ",123)相当于x.foobar=123。
4.delattr(对象,名称)
与setattr()相关的一组函数。参数由一个对象(记住在python中一切都是对象)和一个字符串组成。参数字符串必须是对象属性名称之一。这个函数删除由字符串指定的对象的一个属性。delattr(x, foobar)=del x.foobar
我们可以使用以上四个函数对模块进行一系列操作。
R=hasattr(commons,xxx)判断函数或变量是否存在。
打印(r)
Setattr(commons, age ,18)向commons模块添加一个全局变量age=18,成功创建返回none。
Setattr (config, age ,lambda a:a 1)//向模块添加函数
Delattr(commons, age)//删除模块中的变量或函数。
注意:GetAttr、HasAttr、SetAttr、DelAttr修改内存中的模块,不会影响文件中的真实内容。
0x02实例模拟基于反射机制的web帧路由。
要求:例如,如果我们输入:www.xxx.com/commons/f1,f1的结果将被返回。
#动态导入模块并执行其功能。
url=输入( url:)
target_module,target_func=url.split(/)
m=__import__(lib。target_module,fromlist=True)
Inp=url.split(/)[-1] #拆分url,取出url的最后一个字符串
Hasattr (m,target _ func): #判断commons模块中是否存在字符串inp。
Target _ func=getattr (m,target _ func) #获取inp的引用
目标函数()#执行
否则:
打印( 404 )
涉及
0x00前言
定义f1():
打印(“f1”)
定义f2():
打印( f2 )
def f3():
打印( f3 )
def f4():
打印( f4 )
a=1test.py
将测试作为ss导入
不锈钢f1()
不锈钢f2()
Print(ss.a)我们想导入另一个模块,可以用import。现在,有这样的需求。我可以动态输入一个模块名,我可以随时访问导入模块中的方法或变量。我该怎么办?
Imp=input("请输入要导入的模块的名称:")
CC=__import__(imp)这种方式是通过输入一个字符串来导入你想要导入的模块。
CC.f1() #我们在执行模块中的f1方法上面实现了模块名的动态输入,这样就可以输入模块名,执行里面的函数。但是上面有一个缺点,就是执行的功能是固定的。那么,是否可以通过动态输入函数名并执行来改善呢?
#动态. py
Imp=input(请输入模块:)
dd=__import__(imp)
#相当于进口imp
Inp_func=input(请输入要执行的函数:)
F=getattr(dd,inp_func,None)# func:从导入模块中找到你需要调用的函数inp_func,然后返回这个函数的一个引用。没找到,就一个都不烦。
F() #执行这个函数
我们实现了上面的,动态导入一个模块,动态输入函数名然后执行相应的函数。
当然,上面有一个小问题:我的模块名可能没有存储在本地目录中。它可以用以下方式储存:
那么我们如何处理这种方式呢?请看下面的代码:
DD=_ _ import _ _( lib . text . commons )#这只导入lib模块。
DD=_ _ import _ _( lib . text . commons ,fromlist=true) #使用此方法可以成功导入。
#相当于导入配置
Inp_func=input(请输入要执行的函数:)
f=getattr(dd,inp_func)
f()
0x01反射机制说了这么多。反射机制到底是什么?
实际上,反射是以字符串的形式导入模块;以字符串的形式,转到模块找到指定的函数并执行它。使用字符串形式操作(查找/获取/删除/添加)对象(模块)中的成员,一种基于字符串的事件驱动!
我们先介绍四个内置函数:
1.getattr()函数是Python内省的核心函数。其具体用途一般如下:
A类:
def __init__(self):
self.name=张静
#self.age=24
定义方法(自身):
打印“方法打印”
实例=A()
Getattr (Instance, name, not find) #如果实例对象中有属性名,则打印self.name的值,否则打印 not find
Getattr (Instance, age , not find) #如果实例对象中有属性age,则打印self.age的值,否则,打印 not find
Getattr (a, method , default) #如果有method方法,则打印其地址,否则打印default。
Printattr (a, method , default) () #如果有method方法,运行该函数并打印None或打印default
2.hasattr(对象,名称)
注意:判断object对象是否包含名为name的属性(hasattr是通过调用getattr(ojbect,name)抛出异常实现的)
3.setattr(对象,名称,值)
这是对应的getattr()。参数是一个对象、一个字符串和一个任意值。该字符串可以列出现有属性或新属性。这个函式会将值指派给属性的。这个对象允许它提供。例如,setattr (x," foobar ",123)相当于x.foobar=123。
4.delattr(对象,名称)
与setattr()相关的一组函数。参数由一个对象(记住在python中一切都是对象)和一个字符串组成。参数字符串必须是对象属性名称之一。这个函数删除由字符串指定的对象的一个属性。delattr(x, foobar)=del x.foobar
我们可以使用以上四个函数对模块进行一系列操作。
R=hasattr(commons,xxx)判断函数或变量是否存在。
打印(r)
Setattr(commons, age ,18)向commons模块添加一个全局变量age=18,成功创建返回none。
Setattr (config, age ,lambda a:a 1)//向模块添加函数
Delattr(commons, age)//删除模块中的变量或函数
注意:GetAttr、HasAttr、SetAttr、DelAttr修改内存中的模块,不会影响文件中的真实内容。
0x02实例模拟基于反射机制的web框架路由。
要求:例如,如果我们输入:www.xxx.com/commons/f1,f1的结果将被返回。
#动态导入模块并执行其功能。
url=输入( url:)
target_module,target_func=url.split(/)
m=__import__(lib。target_module,fromlist=True)
Inp=url.split(/)[-1] #拆分url,取出url的最后一个字符串
Hasattr (m,target _ func): #判断commons模块中是否存在字符串inp。
Target _ func=getattr (m,target _ func) #获取inp的引用
目标函数()#执行
否则:
打印( 404 )
涉及
转载请联系作者取得转载授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。