官方文档:https://docs.python.org/2/library/inspect.html
该inspect模块提供了一些有用的函数来帮助获取有关活动对象的信息,例如模块,类,方法,函数,回溯,框架对象和代码对象。例如,它可以帮助您检查类的内容,检索方法的源代码,提取和格式化函数的参数列表,或获取显示详细回溯所需的所有信息。
这个模块提供了四种主要的服务:类型检查,获取源代码,检查类和函数,以及检查解释器堆栈。
inspect.getmembers(object[, predicate] ) #重要
返回按名称排序的(名称,值)对列表中的对象的所有成员。如果提供了可选的谓词参数,则仅包含谓词返回true值的成员。
predicate 参数:ismodule,isclass,ismethod,isfunction,isbuiltin等,该参数是True才会返回匹配到的类型,可见最下方例子
注意:
getmembers()当参数是一个类时,它不返回元类属性(此行为是从dir()函数继承的)。
inspect.getmoduleinfo(path)
返回一个值元组,描述Python如何解释路径标识的文件(如果它是模块),或者None它不会被识别为模块。返回元组,其中name是模块的名称,没有任何封装包的名称,后缀是文件名的尾部(可能不是点分隔的扩展名),mode是将使用的模式(或),module_type是给出模块类型的整数。 module_type将有一个值,可以与中定义的常量进行比较(name, suffix, mode,module_type)open()’r”rb’imp模块; 有关模块类型的更多信息,请参阅该模块的文档。
在2.6版中更改:返回一个命名元组 。ModuleInfo(name, suffix, mode, module_type)
inspect.getmodulename(path)
返回由文件路径命名的模块的名称,不包括封装包的名称。这使用与解释器在搜索模块时使用的算法相同的算法。如果根据解释器的规则无法匹配名称,None则返回。
inspect.ismodule(object)
如果对象是模块,则返回true。
inspect.isclass(object)
如果对象是类,无论是内置的还是在Python代码中创建的,则返回true。
inspect.ismethod(object)
如果对象是用Python编写的绑定或未绑定方法,则返回true。
inspect.isfunction(object)
如果对象是Python函数,则返回true,其中包括由lambda表达式创建的函数。
inspect.isgeneratorfunction(object)
如果对象是Python生成器函数,则返回true。
版本2.6中的新功能。
inspect.isgenerator(object)
如果对象是生成器,则返回true。
版本2.6中的新功能。
inspect.istraceback(object)
如果对象是回溯,则返回true。
inspect.isframe(object)
如果对象是框架,则返回true。
inspect.iscode(object)
如果对象是代码,则返回true。
inspect.isbuiltin(object)
如果对象是内置函数或绑定的内置方法,则返回true。
inspect.isroutine(object)
如果对象是用户定义的函数或内置函数或方法,则返回true。
inspect.isabstract(object)
如果对象是抽象基类,则返回true。
版本2.6中的新功能。
inspect.ismethoddescriptor(object)
如果对象是一个方法描述符返回true,但如果 ismethod(),isclass(),isfunction()或者isbuiltin() 是真实的。
这是Python 2.2的新功能,例如,它是正确的 int.add。传递此测试的对象有一个get()方法但不是set() 方法,但除此之外,属性集也会有所不同。一个 name属性通常是明智的,而且doc往往是。
通过也传递其他测试之一的描述符实现的方法从测试返回false ismethoddescriptor(),仅仅因为其他测试承诺更多 - 例如,im_func当对象通过时,您可以依靠具有 属性(等)ismethod()。
inspect.isdatadescriptor(object)
如果对象是数据描述符,则返回true。
数据描述符既有a get又有set方法。示例是属性(在Python中定义),getsets和成员。后两者在C中定义,并且有更多特定的测试可用于这些类型,这在Python实现中是健壮的。典型地,数据描述符也将具有name与doc属性(属性,getsets,和成员同时具有这些属性的),但是这不被保证。
版本2.3中的新功能。
inspect.isgetsetdescriptor(object)
如果对象是getset描述符,则返回true。
CPython实现细节: getsets是通过PyGetSetDef结构在扩展模块中定义的属性 。对于没有这种类型的Python实现,此方法将始终返回False。
2.5版中的新功能。
inspect.ismemberdescriptor(object)
如果对象是成员描述符,则返回true。
CPython实现细节:成员描述符是扩展模块中通过PyMemberDef结构定义的属性 。对于没有这种类型的Python实现,此方法将始终返回False。
案例解析:
import inspect
class A(object):
def __init__(self):
pass
def desktop_run(self):
print("hello python")
class B(object):
def __init__(self,age):
self.age=age
def desktop_stop(self):
print("bye python")
class C(A,B):
def __init__(self):
A.__init__(self)
B.__init__(self,23)
self._desktop_dict={}
#获取该类和其继承的类的方法,inspect.ismethod用来判断返回的属性是否为对象方法
for f in inspect.getmembers(self,inspect.ismethod):
if f[0].find("desktop") == 0:
print("匹配到的对象方法信息:",f)
self._desktop_dict[f[0]]=f[1]
if __name__ == '__main__':
c=C()
print(c._desktop_dict)
f=c._desktop_dict["desktop_run"] #f为对象方法
f()
print("获取对象c所在的模块(脚本):",inspect.getmodule(c))
运行结果:
/Users/wupeng/PycharmProjects/ScrapyProjects/bin/python /Users/wupeng/PycharmProjects/ScrapyProjects/processing.py
匹配到的对象方法信息: ('desktop_run', <bound method A.desktop_run of <__main__.C object at 0x1040b7438>>)
匹配到的对象方法信息: ('desktop_stop', <bound method B.desktop_stop of <__main__.C object at 0x1040b7438>>)
{'desktop_run': <bound method A.desktop_run of <__main__.C object at 0x1040b7438>>, 'desktop_stop': <bound method B.desktop_stop of <__main__.C object at 0x1040b7438>>}
hello python
获取对象c所在的模块(脚本): <module '__main__' from '/Users/wupeng/PycharmProjects/ScrapyProjects/processing.py'>