今天接触了下pyUSB,事先没看对象内部成员资料,直接用python的dir函数看了看pyUSB的内部构成。突然间想到自己可不可以写个简单的脚本,利用dir或其他函数遍历某个对象内部的所有成员,并打印出来成树状图的形式?于是写了如下对象分析程序:

使用方法 :

import matplotlib.pyplot as plt
import AnalysisClass
m = AnalysisClass.AnalysisClass()
m.analysisObject(plt.Arrow, 'plt.Arrow', 'plt.txt', levelEnd=3)

调用analysisObject即可分析matplotlib的pyplot库内部的成员,并把所有成员函数、成员类以及各成员的__doc__前两行作为概述打印出来。上面的plt.Arrow是要分析的对象,’plt.Arrow’是要分析对象的名称字符串,’plt.txt’是用来保存分析结果的文件名,levelEnd用来指定递归的深度。

上面调用得到的结果:

 

省略若干行

代码概述:

程序核心很简单,就是递归地用dir()函数得到对象的所有成员,对于以下划线开头的内部成员不予处理,其他的如常量(一般全大写)、成员函数、成员类等的名字则保存起来,然后在以这些成员为对象递归地获取下一层的成员列表。

详细程序:

import types
class AnalysisClass:
def __init__(self):
self.level= 0
self.file = None
self.constNum=[]
self.funcNum = [] def _levelTreePrint(self, strs, isConst=False):
levelTab=self.level*4*' '
levelStrHead =[i for i in levelTab]
if self.level != 0:
# strs = str(self.funcNum[-1])+strs
for i in range(self.level):
if (not isConst) and self.funcNum[i] == 1:
continue
else:
levelStrHead[i*4+1] = '|'
levelStrHead[((self.level-1)*4+2):] = ['-','-']
levelStrHead = ''.join(levelStrHead)
levelStr = levelStrHead+strs
else:
levelStr = strs
print levelStr
if self.file != None:
self.file.writelines(levelStr+'\n') # def _isListOrTuple(self, cla):
# if type(cla)==types.ListType or type(cla)==types.TupleType:
# return True
# else:
# return False def _hasAvailableCla(self, cla):
mems = dir(cla)
constMem=[]
claOrFuncMem = []
constMaxLen = 0
funcMaxLen = 0
for i in mems:
lenI = len(i)
if i[0] == '_': # No inner function or inner constants
continue
if i.isupper():
if lenI>constMaxLen:
constMaxLen = lenI
constMem.append(i)
elif i[0:2]!='__' and i[-2:]!='__':# No buildin functions
if lenI>funcMaxLen:
funcMaxLen = lenI
claOrFuncMem.append(i)
return (constMem, constMaxLen, claOrFuncMem, funcMaxLen) def _printConstMem(self, cla, constMem, constMaxLen):
loc_var = locals()
for i in loc_var.iteritems():
if id(i[1]) == id(cla):
cla_loc_name = i[0]
for i in constMem:
tmp = eval(cla_loc_name+'.'+i)
i = i.ljust(constMaxLen+1, ' ')
# if type(tmp)==types.IntType:
# i = i+"(%d)"%tmp
# else:
# i = i+"(NOT AN INT NUMBER)"+str(type(tmp))
i = i + "(%s)"%str(tmp)
self._levelTreePrint(i, isConst=True)
self.constNum[-1] -= 1 def _printClaOrFuncMem(self,cla, cla_name, funcMaxLen, claOrFuncMem):
loc_var = locals()
for i in loc_var.iteritems():
if id(i[1]) == id(cla):
cla_loc_name = i[0]
for i in claOrFuncMem:
iMem = cla_loc_name+'.'+i
iMemReName = cla_name+'.'+i
try:
if None!=eval(iMem):
self._analysisClass(eval(iMem),iMemReName, maxClaNameLen = funcMaxLen)
self.level -= 1
else:
self._levelTreePrint(cla_name.split('.')[-1]+'.'+i+"--'Nothing'")
except Exception,e:
pass
self.funcNum[-1] -= 1 def _analysisClass(self, cla, cla_name, maxClaNameLen = 0):
if hasattr(cla, "__doc__"):
doc = str(cla.__doc__).split('\n')
if len(doc)>=2:
doc = doc[0]+doc[1]
else:
doc = doc[0]
else:
doc = ' ' if self.level!=0 and maxClaNameLen!=0:
sNameTmp = cla_name.split('.')
extraLen = len(sNameTmp[-2])
sName = sNameTmp[-2]+'.'+sNameTmp[-1]
cla_name_tmp = sName.ljust(extraLen+maxClaNameLen+1,' ')
else:
cla_name_tmp = cla_name self._levelTreePrint(cla_name_tmp+':'+str(type(cla))+3*'-'+"\""+doc+"\"")
self.level += 1
if self.level == self.levelEnd:
return
(constMem, constMaxLen, claOrFuncMem, funcMaxLen) = self._hasAvailableCla(cla)
if constMaxLen != 0:
self.constNum.append(len(constMem))
self._printConstMem(cla, constMem, constMaxLen)
self.constNum.pop()
if funcMaxLen != 0:
self.funcNum.append(len(claOrFuncMem))
self._printClaOrFuncMem(cla, cla_name, funcMaxLen, claOrFuncMem)
self.funcNum.pop()
else:
return #===========================================================================
# Analysis the stucture of 'obj'.This function will list out the members of the object as
# a tree.
# @param obj - object,can be class,module,package,etc
# @param obj_name - object name string,should be same to the actual name of 'obj'
# @param file_name - If you want to store the analysis info to a txt file,set this param
# of your file name
# @paramm levelEnd - set the recursion limits.The analysisObject function will recursively
# enum all the members of the 'obj',when the recursion depth equals levelEnd
# the function will stop automatically
#
# Using:
# import AnalysisClass
# import matplotlib.pyplot as plt
# m = AnalysisClass.AnalysisClass()
# m.analysisObject(plt.Annotation, 'plt.Annotation', 'plt.txt', levelEnd=4)
# Written by Liu.2014-07-25
#===========================================================================
def analysisObject(self, obj, obj_name, file_name=None, levelEnd=3):
if file_name != None:
self.file = open(file_name, 'w')
self.levelEnd = levelEnd
self._analysisClass(obj, obj_name, levelEnd)
if self.file !=None:
self.file.close()

分析特定类的python脚本的更多相关文章

  1. 通过Java调用Python脚本

    在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...

  2. 基于binlog来分析mysql的行记录修改情况(python脚本分析)

          最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...

  3. 使用Python脚本分析你的网站上的SEO元素

    撰稿马尼克斯德芒克 上2019年1月, Sooda internetbureau Python就是自动执行重复性任务,为您的其他搜索引擎优化(SEO)工作留出更多时间.没有多少SEO使用Python来 ...

  4. Java调用Python脚本工具类

    [本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...

  5. 调用其他python脚本文件里面的类和方法

    问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...

  6. arcgis python脚本工具实例教程—栅格范围提取至多边形要素类

    arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...

  7. python脚本分析nginx访问日志

    日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...

  8. ArcGIS使用Python脚本工具

    在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...

  9. 用 Python 脚本实现对 Linux 服务器的监控

    目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...

随机推荐

  1. Sina App Engine(SAE)入门教程(5)- SaeSegment(中文分词服务)使用

    分词能干什么? 提取一篇文章的关键字 检测特定的段落中有没有违禁词 智能机器人 …..尽你所想 开启SAE 分词服务 首先你需要在sae的管理面板开始分词服务后才能使用sae的服务.具体的开启操作: ...

  2. yum工具介绍

    当你的linux处于联网状态时,yum工具能够非常方便的在Linux上安装各种软件.补丁等等,而且最重要的一点是完全不用管包的依赖关系.只需要简单的指定你要安装的软件名称,其他工作几乎都交给yum了, ...

  3. 使用MyBatis链接MySQL

    本文主要介绍了如何使用mybatis进行简单的数据库操作.本人使用的是mybatis3.05. 1.创建数据库表(User表) CREATE TABLE `NewTable` (`userId` bi ...

  4. CAD导入ArcScene中线被打断 求解决方案

    cad中是这样 但在arcscene里中是这样

  5. [iOS]如何给Label或者TextView赋HTML数据

    // // ViewController.m // text // // Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights ...

  6. Java API —— Math类

    1.Math类概述         Math 类包含用于执行基本数学运算的方法,如初等指数.对数.平方根和三角函数.  2.成员变量         public static final doubl ...

  7. 英文论文写作之讨论与结论Discussion and Conclusion

    Discussion and Conclusion After viewing these maps, what should immediately appear is the level of r ...

  8. mysql优化 mysql explain

    一篇文章: 使用use index优化sql查询   先看一下arena_match_index的表结构,大家注意表的索引结构CREATE TABLE `arena_match_index` (  ` ...

  9. AndroidJNI 调用JAVA(转)

    转自:http://www.cnblogs.com/likwo/archive/2012/05/21/2512400.html   1. JNIEnv对象    对于本地函数    JNIEXPORT ...

  10. Android的NDK开发(4)————JNI数据结构之JNINativeMethod

    转至:http://blog.csdn.net/conowen/article/details/7524744 1.JNINativeMethod 结构体的官方定义 typedef struct { ...