Python反射介绍

Python015

Python反射介绍,第1张

反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象,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--

动态加载模块用的模块importlib 里面的import_module(“字符串模块路径”, 相对路径包名)

2.getattr(对象,“字符串属性”,默认值)

补充

任意创建一个文件夹,在里面同级创建f1-f4.py的四个文件。

内容如下:

f1.py

f2.py

f3.py

f4.py

f5.py

f4.py:通过动态导入模块,动态添加属性 删除。可以解决接口自动化中的动态传参

F5.py: 通过传参的方式,去获取类的实例方法,可以做到不知道需要哪个方法的时候,用字符串的方法去调用需要的方法。接口自动化中参数化的时候可以用到。

反射机制,当通过类名去反射得到的实例方法,需要传类名进去。通过self或者对象得到的实例方法,不需要传self或者类名。如果是实例对象或者类 去调用静态方法, 都不用给函数传self cls