分析特定类的python脚本

今天接触了下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脚本

时间: 2024-10-24 12:08:08

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

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

最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎么样的? 但是却不需要行记录的修改内容,只需要了解 行数据的 变动情况.故也整理了下. 昨晚写的脚本,因为个人python能力有限,本来想这不发这文,后来想想,没准会有哪位园友给出优化建议. 如果转载,请注明博文来源: www.cnblogs.com/xinysu/   ,版权归 博客园 苏家小萝卜 所有.望各

Python脚本分析CPU使用情况

在这篇文章中,我将讨论一个工具,用以分析Python中CPU使用情况.CPU分析是通过分析CPU执行代码的方式来测量代码的性能,以此找到代码中的不妥之处,然后处理它们. 接下来我们将看看如何跟踪Python脚本使用时CPU使用情况,重点关注以下几个方面: 1.cProfile 2.line_profiler 3.pprofile 4.vprof 测量CPU使用率 对于这篇文章,我将主要使用与内存分析中使用脚本相同的脚本,具体如下: 另外,请记住,在PyPy2中,您需要使用与之配合的pip版本:

python脚本分析nginx访问日志

日志格式如下: 223.74.135.248 - - [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" 404 14227 "http://www.yidianchina.com/login/getValidateCode" "Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)" 分别是IP,访问时间,请求方法,

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

hon 分享到:8 原文出处: 曹江华 目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的脚本实现对 Linux 服务器的监控. 本文介绍一下使用 Python 脚本实现对 Linux 服务器 CPU 内存 网络的监控脚本的编写. Python 版本说明 Python 是由 Guido va

简易Python脚本爬取我爱我家网站信息

最近杭州房价涨得好凶,要不要跟风买房,确实是个头疼的问题,不过做点准备总是没坏处的.前段时间我找了一个我爱我家的中介了解了下情况,他提到我爱我家官网,说上面信息的时效性和准确度都不错,可以时常关注一下.本着程序员的天性,一切可以用脚本偷懒的事情就都不要麻烦自己动手了,于是就写了一个脚本,用于监测我爱我家官网的消息变动,有新的房源信息就发短信给自己. 首先分析一下可行性,爬取网站,取得HTML页面的信息当然是没什么难度的,接下来就是从中整理出有用的信息,然后发短信给自己了. 发送短信的服务,搜索了

Python ----脚本CGI、特点、应用、开发环境

CGI CGI 目前由NCSA维护,NCSA定义CGI如下: CGI(Common Gateway Interface),通用网关接口,它是一段程序,运行在服务器上如:HTTP服务器,提供同客户端HTML页面的接口. CGI程序可以是Python脚本.Perl脚本.Shell脚本.C或者C++程序等. 服务器 在你进行CGI编程前,确保您的Web服务器支持CGI及已经配置了CGI的处理程序. 所有的HTTP服务器执行CGI程序都保存在一个预先配置的目录.这个目录被称为CGI目录,并按照惯例,它被

使用Python脚本批量裁切栅格

????对栅格的裁切,我们通常使用裁切(数据管理-栅格-栅格处理)或按掩膜提取(空间分析-提取分析)来裁切,裁切的矢量要素通常是一个要素图层或Shape文件.如果要进行批量处理,可以使用ToolBox中的批量处理工具.但是,有时我们选择的裁切矢量要素不是一个要素图层,而是要素图层中的一个要素,如按标准图幅裁切栅格影像,以前的做法是将要素一个一个的导出来,再进行批量处理.快速导出方法:ArcGIS按字段属性分割文件. ????现在,可以使用Python脚本来批量裁切,在网上找了位大神的原始代码学习

[Python]linux自己定义Python脚本命令

在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用putty这个工具,用SSH方法连上远端server 传输文件 使用FTP传输,这里用filezilla作为本地server,图形化界面,方便快捷 安装文件中引用的python包 wget url 命令联网下载安装包 wget http:/www.^&*&%%& 解压缩(详细可见blog:

[Python]linux自定义Python脚本命令

在window下写好的程序配置到Linux上,要实现任意目录下的命令调用. 由于初学Linux,这里从文件传输等最基本的方法入手,记录配置的过程中遇到的各种问题. 连接远端服务器 这里使用putty这个工具,用SSH方法连上远端服务器 传输文件 使用FTP传输,这里用filezilla作为本地服务器,图形化界面,方便快捷 安装文件里引用的python包 wget url 命令联网下载安装包 wget http:/www.^&*&%%& 解压缩(具体可见blog:http://www