反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象,Python作为一门动态编程语言,当然也有反射机制,本文介绍Python反射函数使用方法。
在程序运行时可以获取对象类型定义信息,例如,Python中的type(obj)将返回obj对象的类型,这种获取对象的type、attribute或者method的能力称为反射。通过反射机制,可以用来检查对象里的某个方法,或某个变量是否存在。也就是可以 通过字符串映射对象的方法或者属性 。
Python反射常用的内置函数
先创建一个类:
利用反射的能力,我们可以通过属性字典 __dict__ 来访问对象的属性:
执行输出:
接下来测试一下其他反射函数:
Out:
Out:
Out:
Out:
Out:
Out:
下面介绍两种Python反射的应用场景。
从前面举的例子中,我们了解到可以通过 字符串 来获取对象的属性( getattr() ),这是非常有用的一个功能。比如,一个类中有很多方法,它们提供不同的服务,通过输入的参数来判断执行某个方法,一般的使用如下写法:
如果函数比较少这样写没有太大问题,如果有很多,这样写就比较复杂了,需要写大量else语句,可以使用反射机制来写:
这样是不是简洁了很多,上面的例子中,通过反射,将字符串变成了函数,实现了对对象方法的动态调用。
可以通过setattr()方法进行动态属性设置,在使用scapy库构造报文时,我们需要设置某些报文字段,然而网络协议的报文字段很多,在需要设置大量字段时,一个一个的赋值就很麻烦:
可以使用setattr()方法来赋值:
--THE END--
动态语言里面的eval就是干这个用的type1="int"
type2="str"
a=eval(type1+"(2222)") 这里a就是int型的2222 相当于执行a=eval("int(2222)")
b=eval(type2+("2222")) 这里b就是string型的"2222" 相当于执行b=eval("str(2222)")
另外Python偏函数特性也比较像这个,你可以搜索下看看。
from turtle import TurtleScreen, RawTurtle, TK
import random
def main():
root = TK.Tk()
cv1 = TK.Canvas(root, width=400, height=600, bg="#ddffff")
cv2 = TK.Canvas(root, width=400, height=600, bg="#ffeeee")
cv1.pack(side="left")
cv2.pack(side="right")
s1 = TurtleScreen(cv1)
s1.bgcolor(0.85, 0.85, 1)
s2 = TurtleScreen(cv2)
s2.bgcolor(0.85, 0.85, 1)
p = RawTurtle(s1)
q = RawTurtle(s2)
p.color("blue", (1, 0.85, 0.85))
p.width(3)
q.color("blue", (1, 0.85, 0.85))
q.width(3)
for t in p,q:
t.shape("turtle")
#t.lt(36)
q.lt(180)
step = random.randint(5, 15)
angle = random.randint(45, 89)
for t in p, q:
t.begin_fill()
for i in range(20):
p.fd(step*i)
p.lt(angle)
q.fd(step*i)
q.rt(angle)
for t in p,q:
t.end_fill()
t.lt(54)
t.pu()
t.bk(50)
return "EVENTLOOP"
if __name__ == '__main__':
main()
TK.mainloop()