这篇文章将为大家详细讲解有关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这种是不是也可以实现这种方法呢?