Chinaunix

标题: 自己写的一个“打印父类”的一个小程序 [打印本页]

作者: 爱知    时间: 2009-02-25 11:40
标题: 自己写的一个“打印父类”的一个小程序
当学习一些大型的、复杂的程序时这个应该会很有用
列出来,大家共享

若想经常使用里面的两个函数,可以在 PYTHONSTARTUP 环境变量文件里
添加一句:from prt_deep_bases import *
以后就可以直接应用了

prt_deep_bases.py

#!/usr/bin/env python

_prestr = ''        # for function tree()
_level = 0        # for function info()

def tree(cls):
    """ print the base_classes of the given class by tree diagram """
    global _prestr    # the pre_string of every printed line
    bases = cls.__bases__

    if bases:
        if not _prestr :            # print the first line
            print  cls.__name__
        _prestr += ' ' * 4
        n = length = len(bases)        # n flags the number of unprinted base_class
        for i in range(length):
            print _prestr + '+--->' + bases[i].__name__
            if bases[i].__bases__:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_prestr += ('|   ' if n > 1 else ' ' * 4)&nbsp;&nbsp;&nbsp;&nbsp;# n <= 1 indicates the last base of bases
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tree(bases[i])&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# recursion
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_prestr = _prestr[:-4]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n -= 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# decrease the number of unprinted base_class

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if i == length - 1:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_prestr = _prestr[:-4]

def info(cls):
&nbsp;&nbsp;&nbsp;&nbsp;""" print the base_classes of the given class indentively one by one """
&nbsp;&nbsp;&nbsp;&nbsp;global _level&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# the recursion level
&nbsp;&nbsp;&nbsp;&nbsp;bases = cls.__bases__

&nbsp;&nbsp;&nbsp;&nbsp;if bases:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print ' ' * 4 * _level + cls.__name__
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for each_base in bases:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print ' ' * 4 * (_level+1) + '+--->' + each_base.__name__
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_level += 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for each_base in bases:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info(each_base)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# recursion
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_level -= 1

def _app():
&nbsp;&nbsp;&nbsp;&nbsp;""" test the function tree() and info() """
&nbsp;&nbsp;&nbsp;&nbsp;class a:pass
&nbsp;&nbsp;&nbsp;&nbsp;class b:pass
&nbsp;&nbsp;&nbsp;&nbsp;class c(a, b):pass
&nbsp;&nbsp;&nbsp;&nbsp;class d:pass
&nbsp;&nbsp;&nbsp;&nbsp;class e(c, d):pass
&nbsp;&nbsp;&nbsp;&nbsp;class f:pass
&nbsp;&nbsp;&nbsp;&nbsp;class g(e, f):pass

&nbsp;&nbsp;&nbsp;&nbsp;title = lambda str: '='*10 + str + '='*10

&nbsp;&nbsp;&nbsp;&nbsp;print title('tree')
&nbsp;&nbsp;&nbsp;&nbsp;tree(g)
&nbsp;&nbsp;&nbsp;&nbsp;print title('info')
&nbsp;&nbsp;&nbsp;&nbsp;info(g)
&nbsp;&nbsp;&nbsp;&nbsp;print title('='*4)

if __name__ == '__main__':
&nbsp;&nbsp;&nbsp;&nbsp;_app()


[ 本帖最后由 爱知 于 2009-2-26 17:48 编辑 ]
作者: 爱知    时间: 2009-02-25 11:41
运行结果:
==========tree==========
g
    +--->e
    |       +--->c
    |       |       +--->a
    |       |       +--->b
    |       +--->d
    +--->f
==========info==========
g
    +--->e
    +--->f

    e
        +--->c
        +--->d

        c
            +--->a
            +--->b

========================
作者: 爱知    时间: 2009-02-25 11:44
以上程序是在学习 wxpython 时用的
>>> import wx
>>> tree(wx.Frame)
Frame
    +--->TopLevelWindow
            +--->Window
                    +--->EvtHandler
                            +--->Object
                                    +--->object
>>>
作者: zhenglxd    时间: 2009-02-25 11:49
标题: 回复 #3 爱知 的帖子
恩。。感谢您为人类的python史发展推动了不可动摇坚定不移关键性的一步
那个。。虽然我一点都没看懂。。
不过还是从字里行间中感受到了一股,强大的,扑面而来的,迅雷不及掩耳的,质朴的,无法用言语表达的感觉。
再此对您的无私的,伟大的,博爱的,宽正宏和的开源气节予以精神上的表彰
楼下的继续夸,夸到楼主脸红,把所有好东东都共享出来为止
作者: xiaoyu9805119    时间: 2009-02-25 11:52
不错,感谢分享
作者: 23号    时间: 2009-02-25 20:25
cool...
作者: bleem1998    时间: 2009-02-25 22:49
很帅很有用
作者: 爱知    时间: 2009-02-26 17:54
又加了一些注释
作者: nhkdxx0    时间: 2009-03-01 16:33
很好的东东




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2