Python反射介绍
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python反射介绍相关的知识,希望对你有一定的参考价值。
参考技术A反射机制是面向对象编程语言中比较重要的功能,可以动态获取对象信息以及动态调用对象,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--
python 反射
反射:让对象告诉我们他是什么,他有什么,并获取使用
本文主要介绍 inspect 模块的使用:
inspect模块: 用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等;
Doc:这样写到
The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects.
这个模块是针对模块,类,方法,功能等对象提供些有用的方法。
- getmembers(object[, predicate]):
这个方法是dir()的扩展版,它会将dir()找到的名字对应的属性一并返回,形如[(name, value), ...]。另外,predicate是一个方法的引用,如果指定,则应当接受value作为参数并返回一个布尔值,如果为False,相应的属性将不会返回。使用is*作为第二个参数可以过滤出指定类型的属性。
以下例子中展示了如何获取模块中的类,如何获取类中的方法:
import inspect import importlib # 导入模块 module = importlib.import_module(moduleName) # 获取模块中的所有类 classes = inspect.getmembers(module,inspect.isclass) # 遍历类并过滤 for name, cls in classes: if issubclass(cls, TestCase): # 获取类中的方法 methods = inspect.getmembers(cls,inspect.ismethod) for name, method in methods: if method.__name__.startswith("test"): dict = ‘psoName‘: psoName, ‘className‘: module.__name__+"."+cls.__name__, ‘methodName‘: method.__name__, ‘description‘: method.__doc__ dict[‘name‘] = dict[‘psoName‘]+"."+dict[‘className‘]+"."+dict[‘methodName‘]
inspect模块的实现本质是依赖于dir与getattr:
def getmembers(object, predicate=None): """Return all members of an object as (name, value) pairs sorted by name. Optionally, only return members that satisfy a given predicate.""" results = [] for key in dir(object): try: value = getattr(object, key) except AttributeError: continue if not predicate or predicate(value):
# 元组列表 results.append((key, value)) results.sort() return results
反射详细参考:https://www.cnblogs.com/huxi/archive/2011/01/02/1924317.html
以上是关于Python反射介绍的主要内容,如果未能解决你的问题,请参考以下文章