python反射机制是什么

  介绍

这篇文章将为大家详细讲解有关python反射机制是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

<强>反射

反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性,方法,导入模块,是一种基于字符串的事件驱动。

解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。相对于编译型语言存在   的,源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。   比如Python/JavaScript /, Perl /壳等都是解释型语言。

Python是一门解释型语言,因此对于反射机制支持很好。在Python中支持反射机制的函数有getattr (), setattr (), delattr (), exec (), eval (), __import__,这些函数都可以执行字符串。

eval

计算指定表达式的值。它只能执行单个表达式,而不能是复杂的代码逻辑。而且不能是赋值表达式。

单个表达式

a =,“12, +, 43个“b =, eval ()   打印(b)

复杂表达式

a =,“打印(12,+,43);,打印(1111)“b =, eval ()   打印(b) #,输出:Traceback  (most  recent  call 最后):   File 才能“xxxx.py",, line  10,拷贝& lt; module>   ,,,b =, eval ()   File 才能“& lt; string>“line  1   ,,,印刷(12,+,43);,打印(1111)   ,,,,,,,,,,,,,,,,^   SyntaxError: invalid 语法

赋值

a =, 1 b =, eval (“a =, 21“)   打印(b)

通常我们使用eval的时候,主要是使用它的返回值,获取表达式计算出的值

执行

执行复杂表达式,返回值永远都是没有

b =, exec (“aa =, 21“)   打印(b),,,,,, #,没有,exec返回值为Noneprint (aa),,,, #, 21日执行执行了赋值语句,并定义了aa变量

执行复杂语句

a =, & # 39; & # 39; & # 39; ret =, []   for 小姐:拷贝范围(10):   ,,,ret.append (i) & # 39; & # 39; & # 39; exec ()   打印(ret),,, #, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

导入模块

#,导入模块exec (“import  config")   打印(config.KEYWORD) #,动态创建类class 基础:   ,,,def  __init__(自我):   ,,,,,,,印刷(“Base")      时间=a “Base" exec (a +“()”)

导入模块这个功能就非常屌了,这样我们就可以动态的创建各种模块类。

eval()函数和exec()函数的区别:   eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。   eval()函数可以有返回值,而exec()函数返回值永远为None。

看一下这个例子

class 基础:   ,,,def  __init__(自我):   ,,,,,,,印刷(“Base"),,,, def 测试(自我):   ,,,,,,,印刷(“test"),,,,,,,, return “基地:test"

如果我们想通过字符串来调用一个对象的测试方法,应该怎么做呢,如果要获取返回值,那么可以使用

b =, eval (““()”)   打印(b)

输出:

测试   基地:测试

如果不需要获取返回值,那么可以使用执行,执行(““()“),输出:测试

虽然我们可以使用eval和执行来执行以上代码,但是这种方式有一个缺陷,假如这个属性是不存在的,那么这种调用就会报错。那么做好的方式是什么呢?先判断属性是否存在,如果存在就调用,不存在就不调,用python为我们提供了一套方法:hasattr, getattr, setattr, delattr

<强> hasattr

def  hasattr (* args,, * * kwargs):, # real  signature 未知   ,,,,,,   ,,,Return  whether 从而object  has  an  attribute  with 从而given 名字。   ,,,,   ,,,却;能够is  done  by  calling  getattr (obj,名称),以及catching  AttributeError。   ,,,,,,   ,,,通过

通过源码注释我们知道,它返回对象是否具有指定名称的属性。而且它是通过调用getattr并捕获AttributeError异常来判断的。就像上面的属性调用,我们就可以使用hasattr (a,“test")来判断,通过源码注释我们也可以思考一下,eval这种是不是也可以实现这种方法呢?

python反射机制是什么