python中反射4种方法的基本使用,python的反射机制

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: