python查看模块功能_Python进阶之inspect模块使用详解

前几篇内容我们详细探讨了如何从Python中获取帮助信息:

4ec2d5628535e5dd2280f23e2ae7a2e9cf1b624e.jpeg?token=0ce6d4b04386628a65eeff50d98baaae&s=AFBA7B85C62238AD4E8909330300A0D1前情回顾

1.查看模块、类提供了哪些接口:

需要帮助吗?dir函数的孪生兄弟,Python中魔法方法__dir__详解

2.查看对象内部属性信息:

查看对象内部属性的名称和值,Python“魔法”属性__dict__的使用

3.使用帮助文档的具体操作:

你真的会用帮助文档吗?Get这些神技能,你就是一个Python学霸

上面的内容能够帮助我们很好地理解一个类或者模块,作为初学者,正确使用上面的方法,基本上不存在理解不了的模块(英文不好的小伙伴使用翻译工具)。因为对于知识点的掌握,上面的方法可以很全面地获得模块或者类的信息(第一手资料,来自帮助文档)

0e2442a7d933c89522653bf08d3276f6830200cd.jpeg?token=872c97df60e69553b70f7ff4fa4c4158&s=5918AB5739465EC858FDA8DB0100C0B3inspect来了

总体来讲,上述方法只是入门级别的,而且,封装性不是很好,知识点也很零碎。

今天,给大家介绍一种功能更全的获取现场对象的模块inspect。

inspect模块

该模块功能很强大,它提供了一些函数便于我们了解现场对象,其实就是用来检查活动对象信息的(这个很重要,它可以获取运行时的一些函数信息)。但是我们使用它可以扩展实现一些额外的功能,除了能实现上面的基本功能外,它还有一些很高级的用法:

d0c8a786c9177f3eb74345f82bee3ec19e3d56f3.jpeg?token=982a8583a22de22df985d801ebfde73d&s=EF7A0DC706E30AA641ADAC7903001010我们探寻一些更高级的用法

获取模块、类、实例的详细信息;获取模块、类、函数的帮助文档;获得类、方法(函数)的源代码;获取函数的详细参数信息(位置参数、默认参数等)。查看类的层次结构;检查程序执行时的运行时环境。有哪些用处?

它提供的功能很多:

359b033b5bb5c9ea9f225cea8b18b3063bf3b389.jpeg?token=4680e3dd62e62e692af4c5b18fc7cc9a&s=A77B5A9648314A8C36CBE44D030070BB提供一些更加丰富的功能

如果我们没有Pycharm这样强大的编译器(按下Ctrl点击一个类或者函数名即可跳转到源代码中),我们使用inspect提供的接口,同样可以实现查看类或函数源代码的功能;

9345d688d43f87940136b7fe8e3a0bf21ad53a38.jpeg?token=7e036086046388009fd76807cdb6a3e6&s=F500F51D0AC438DEB59D1C870300E0E1可以查看源代码

我们在调试程序时,是不是觉得类似Pycharm、Spyder、WingIDE等这类编译器很强大?能够实时显示某一函数的运行时状态信息,我们使用inspect模块也可以获取到这些信息;

d0c8a786c9177f3efa7a77f32cee3ec19e3d56ad.jpeg?token=1a8c5207c156f9f415e8c6d00f5215d4&s=F33B30C612A4814B4052BD8103007088调试程序

对于多继承类,如何判断子类首先继承哪个父类,使用inspect模块提供的接口很容易找到这个父类,并且它还能够清楚展示类继承的层次体系,这比单纯使用dir(cls)获取到的类的继承信息更加清楚;

d0c8a786c9177f3eab0446db2cee3ec19e3d56df.jpeg?token=18c2b0f2bca27e42fea3887eb2b6cc20&s=6E942C8946376382482CFCD8030080B1研究类的层次结构

怎么样,通过上面的解释是不是瞬间感觉它的功能丰富了?

今天,我们先来了解下它是如何获取模块、类、实例的详细信息的

示例模块

首先,我们创建一个模块,用于测试

55e736d12f2eb938d18798ec88438033e4dd6fe9.jpeg?token=0ba44b1cc8be1e0976d43cfb8331536b&s=C800CB154D006ACE5E7114DA0300D031demo模块

#!/usr/bin/env python

# -*- coding:utf-8 -*-

# Author:bob

# ProjectName : bowen

# DefaultFileName : demo.py

# User : Administrator

# Time : 2020/1/7 22:45

# IDEName : PyCharm

"""这是一个示例模块,用于测试inspect模块

"""

def module_level_function(arg1, arg2='default', *args, **kwargs):

"""这个函数是在模块中定义的函数."""

local_variable = arg1 * 2

return local_variable

class A(object):

"""模块中的自定义类A"""

def __init__(self, name):

self.name = name

def get_name(self):

"返回类的实例的名称"

return self.name

instance_of_a = A('一个实例')

class B(A):

"""这是类B

它继承自A类.

"""

# 这个方法是B类独有的方法.

def do_something(self):

"""B类的实例提供的接口"""

def get_name(self):

"重写了A类的方法"

return 'B(' + self.name + ')'

大家可以复制粘贴到自己的电脑中,保存为demo.py

getmembers()了解内容

使用getmembers()发现成员对象的属性,返回结果取决于想要了解的对象类型,模块返回其中包含的类和函数,类则返回其包含的方法和属性。

f31fbe096b63f6248169f0e7db65eefe1b4ca3c2.jpeg?token=f4c1ef7a0f19fec3ee64fe55ee93daa2&s=60A09D545EE2ED4314BE8D8B0300308B函数使用方法

inspect.getmembers(modelName or clsName or InstanceName or funcName, inspect.ismodel or inspect.isclass or inspect.ismethod or inspect.isfunction or etc.)

函数中第一个参数传入模块、类、实例或函数的名称,第二个参数用来过滤返回的对象(如ismodel过滤模块、isclass过滤类)

函数返回值是一个元组列表,元组中包含两个值(成员名和成员类型)

模块信息

import demo

import inspect

for name, data in inspect.getmembers(demo):

if name.startswith('__'):

continue

print('{} : {}'.format(name, data))

运行结果如下

2f738bd4b31c87014f9c427f7c5e9b290708ff2d.jpeg?token=5de250c4ebf1b72f2f8ce3296cf2d2ac&s=E8C281449FA1B5605EE92D0F0200E0C1输出模块中的类和函数(包含内存地址)

只检查其中的类呢?可以将第二个参数设置为inspect.isclass即可。

for name, data in inspect.getmembers(demo, inspect.isclass):

if name.startswith('__'):

continue

print('{} : {}'.format(name, data))

>>>

A :

B :

类信息

adaf2edda3cc7cd90a9d900d65202439b90e915d.jpeg?token=627618fa3667874a2cdb9814493366ca&s=F233716C8AE4944F0AD7A6800300E09B类信息获取

显示类的所有信息,代码如下:

import demo

import inspect

import pprint

pprint.pprint(inspect.getmembers(demo.A), width=70)

返回了该类的所有信息,包括属性、方法、槽以及类的其它成员,多个元组组成的列表。

[('__class__', ),

('__delattr__',

),

('__dict__',

mappingproxy({'__dict__': ,

'__doc__': '模块中的自定义类A',

'__init__': ,

'__module__': 'demo',

'__weakref__': ,

'get_name': })),

('__dir__', ),

('__doc__', '模块中的自定义类A'),

('__eq__', ),

('__format__', ),

('__ge__', ),

('__getattribute__',

),

('__gt__', ),

('__hash__', ),

('__init__', ),

('__init_subclass__',

),

('__le__', ),

('__lt__', ),

('__module__', 'demo'),

('__ne__', ),

('__new__',

),

('__reduce__', ),

('__reduce_ex__', ),

('__repr__', ),

('__setattr__',

),

('__sizeof__', ),

('__str__', ),

('__subclasshook__',

),

('__weakref__', ),

('get_name', )]

inspect.ismethod和inspect.isfunction的区别

inspect.ismethod只识别类的实例的绑定方法,inspect.isfunction识别类的所有方法。

pprint.pprint(inspect.getmembers(demo.instance_of_a, inspect.ismethod), width=70)

>>>

[('__init__',

>),

('get_name',

>)]

pprint.pprint(inspect.getmembers(demo.B, inspect.ismethod), width=70)

>>>

[('__init__', ),

('do_something', ),

('get_name', )]

从A类继承的方法会被标识为B类的方法

获取帮助文档

902397dda144ad34bb9f98438c8309f230ad85fd.jpeg?token=c54c1c3e4590bc3155fb1cb3023c5e50&s=AE63CE165B1677CADE4955450300E0F0获取帮助文档

使用inspect.getdoc()可以获取对象的docstring,返回值是对象的__doc__属性值,tab被扩展为空格,并且缩进保持一致。看下使用getdoc()和__doc__的区别:

print('B.__doc__')

print(demo.B.__doc__)

print('\ngetdoc(B)')

print(inspect.getdoc(demo.B))

两者处理方式稍有差异,如图

c2cec3fdfc0392456c9d66d2dbb5a1c47c1e25ee.jpeg?token=c4241896606008986d8f47492ee821e2&s=F0C291421FA09560046D24BF0200F082处理差异

当然,除了docstring,还可以从实现对象的源文件中获取注释,getcomments()会查看对象的源文件,并查找实现代码前的注释。如:

print(inspect.getcomments(demo.B.do_something))

>>>

# 这个方法是B类独有的方法.

函数中传入模块名称,则返回该模块的第一个注释(出现空行表示注释结束)

print(inspect.getcomments(demo.B.do_something))

>>>

# -*- coding:utf-8 -*-

# Author:bob

# ProjectName : bowen

# DefaultFileName : demo.py

# User : Administrator

# Time : 2020/1/7 22:45

# IDEName : PyCharm

我的返回了一串自定义的编译信息。

好了,今天的内容就到这里了,今天只是些基本操作,对于重要内容我们留到后面,后续为大家奉上如何使用inspect模块进行一些更高级的操作。

转载请注明出处,百家号:Python高手养成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值