django源碼分析--00源碼分析工具

Python是一門非常容易入門,但非常難以精通的一門編程語(yǔ)言。難在面向?qū)ο?繼承集合、多態(tài)、組合等等),難在抽象(設(shè)計(jì)模式),難在語(yǔ)法糖,難在元編程,難在代碼可以非常非常靈活的組合。

當(dāng)我遇到瓶頸需要通過(guò)閱讀大量框架代碼來(lái)提升編程水平的過(guò)程中,由于框架性代碼過(guò)于靈活或抽象,很多時(shí)候沒(méi)辦法僅通過(guò)閱讀源代碼就能理解,而是需要加入日志去運(yùn)行、調(diào)試來(lái)查看當(dāng)前對(duì)象是什么類,當(dāng)前對(duì)象有哪些屬性,當(dāng)前對(duì)象是被誰(shuí)調(diào)用的。

下面分享兩個(gè)我在閱讀開(kāi)源框架源碼時(shí)常用的分析工具:

裝飾器

查看調(diào)用者的文件位置路徑和代碼調(diào)用所在的行數(shù),通過(guò)這種方式我可以一層一層的追蹤代碼執(zhí)行的源頭在哪里。
也就是說(shuō)一般使用它的場(chǎng)景是理解代碼線性處理過(guò)程。

utils.py
# -.- coding:utf-8 -.-
from __future__ import print_function


def findcaller(func):
    def wrapper(*args,**kwargs):
        import sys
        f=sys._getframe()
        filename=f.f_back.f_code.co_filename
        lineno=f.f_back.f_lineno
        print('{} {!s:<20} {} {} {} {} {}'.format(func.func_name, 'Called By ', filename, '', lineno, args, kwargs))
        return func(*args,**kwargs)
    return wrapper
使用方法
earth.py
# -.- coding:utf-8 -.-
import utils


@utils.findcaller
def golden():
    return 'metal'


@utils.findcaller
def wood():
    return golden()


@utils.findcaller
def water():
    return wood()


@utils.findcaller
def fire():
    return water()


@utils.findcaller
def land():
    return fire()


print(land())
輸出結(jié)果
land Called By            C:/Users/zhengtong/earth.py  31 () {}
fire Called By            C:/Users/zhengtong/earth.py  28 () {}
water Called By            C:/Users/zhengtong/earth.py  23 () {}
wood Called By            C:/Users/zhengtong/earth.py  18 () {}
golden Called By            C:/Users/zhengtong/earth.py  13 () {}
metal

參考網(wǎng)址:
Stansosleepy的簡(jiǎn)書(shū)博客

?
?
?
?
?
?

內(nèi)省函數(shù)

很多時(shí)候開(kāi)源框架的文檔并沒(méi)有細(xì)致到告訴你每一個(gè)方法是什么意思,怎么用。
通常我在使用一個(gè)框架的某個(gè)組件功能時(shí),習(xí)慣看看調(diào)用某個(gè)方法返回的結(jié)果,并分析一下該結(jié)果對(duì)象中包含有哪些可調(diào)用的方法,每個(gè)方法綁定的是哪些類對(duì)象,通過(guò)這些屬性對(duì)象可以使我對(duì)整個(gè)框架的功能和理解更全面。

utils.py
# -.- coding:utf-8 -.-
from __future__ import print_function

class ObjectAttrs(object):

    """
    一般用于調(diào)試某個(gè)對(duì)象時(shí)使用,當(dāng)前這個(gè)工具類會(huì)將調(diào)試對(duì)象和其所屬的所有繼承對(duì)象的屬性依次羅列出來(lái)。
    
    變量 showed_list 它是一個(gè)類變量, 用于記錄已顯示過(guò)的對(duì)象.
    
    使用方法:
    ObjectAttrs.show(調(diào)試對(duì)象)
    """

    showed_list = []

    @classmethod
    def show(cls, _class, show_attr=True, show_doc=False, _parent_class=None):
        """
        :param _class: 必填, 任意對(duì)象. 
        :param show_attr: 是否顯示_class對(duì)象的所有attribute.                 
        :param show_doc: 是否顯示_class對(duì)象的__doc__屬性.
        :param _parent_class: 內(nèi)部使用的參數(shù), 用來(lái)傳遞_class對(duì)象的父類.                 
        :return: 
        """

        def _show(class_name):
            if class_name in cls.showed_list:
                return
            else:
                cls.showed_list.append(class_name)

            parent_class_name = ' inherited by {}'.format(_parent_class) if _parent_class else ''
            blank_lines = '\n' * 5 if show_attr else ''
            print(blank_lines, class_name, parent_class_name, sep='')

            if not show_attr: return

            for x in dir(class_name):
                if not show_doc:
                    if x == '__doc__':
                        continue
                try:
                    attr_name = x
                    attr_type = type(getattr(class_name, attr_name))
                    attr_object = getattr(class_name, attr_name)
                    print('{!s:<60}{!s:<60}{}'.format(attr_name, attr_type, attr_object))
                except:
                    print('{!s:<60}{}'.format(attr_name, 'error'))

        _show(class_name=_class)

        parents = list(getattr(_class, '__bases__', ''))
        parents.append(getattr(_class, '__class__', ''))
        parents = [i for i in parents if i is not object and i is not type and i]

        for i in parents:
            cls.show(_class=i, _parent_class=_class, show_doc=show_doc, show_attr=show_attr)
源代碼文件
fox.py
# -.- coding:utf-8 -.-
import utils


class Base(object):

    def breathe(self):
        return 'breathe'


class Animal(Base):

    def run(self):
        return 'run'

    def walk(self):
        return 'walk'

    def sleep(self):
        return 'sleep'


class FoxManager(object):

    def find_other_fox(self):
        return 'find_other_fox'
        
    def drink(self):
        return 'drink water'
        
    def eat(self):
        return 'eat meat'


class Fox(Base):

    def __init__(self):
        self.name = 'aurora fox'
        self.sex = 'male'
        self.actions = FoxManager()
        
使用方法1: 僅顯示對(duì)象的所有繼承關(guān)系
import utils
utils.ObjectAttrs.show(Fox(), show_attr=False)
# 輸出結(jié)果
<__main__.Fox object at 0x035D2B30>
<class '__main__.Fox'> inherited by <__main__.Fox object at 0x035D2B30>
<class '__main__.Base'> inherited by <class '__main__.Fox'>
使用方法2: 僅顯示當(dāng)前對(duì)象的所有屬性
import utils
utils.ObjectAttrs.show(Fox(), show_parent=False)
# 輸出結(jié)果
<__main__.Fox object at 0x030F2910>
__class__                                                   <type 'type'>                                               <class '__main__.Fox'>
__delattr__                                                 error
__dict__                                                    <type 'dict'>                                               {'name': 'aurora fox', 'actions': <__main__.FoxManager object at 0x030F2F50>, 'sex': 'male'}
__format__                                                  <type 'builtin_function_or_method'>                         <built-in method __format__ of Fox object at 0x030F2910>
__getattribute__                                            error
__hash__                                                    error
__init__                                                    <type 'instancemethod'>                                     <bound method Fox.__init__ of <__main__.Fox object at 0x030F2910>>
__module__                                                  <type 'str'>                                                __main__
__new__                                                     <type 'builtin_function_or_method'>                         <built-in method __new__ of type object at 0x51FA68B8>
__reduce__                                                  <type 'builtin_function_or_method'>                         <built-in method __reduce__ of Fox object at 0x030F2910>
__reduce_ex__                                               <type 'builtin_function_or_method'>                         <built-in method __reduce_ex__ of Fox object at 0x030F2910>
__repr__                                                    error
__setattr__                                                 error
__sizeof__                                                  <type 'builtin_function_or_method'>                         <built-in method __sizeof__ of Fox object at 0x030F2910>
__str__                                                     error
__subclasshook__                                            <type 'builtin_function_or_method'>                         <built-in method __subclasshook__ of type object at 0x030F9968>
__weakref__                                                 <type 'NoneType'>                                           None
actions                                                     <class '__main__.FoxManager'>                               <__main__.FoxManager object at 0x030F2F50>
name                                                        <type 'str'>                                                aurora fox
run                                                         <type 'instancemethod'>                                     <bound method Fox.run of <__main__.Fox object at 0x030F2910>>
sex                                                         <type 'str'>                                                male
sleep                                                       <type 'instancemethod'>                                     <bound method Fox.sleep of <__main__.Fox object at 0x030F2910>>
walk                                                        <type 'instancemethod'>                                     <bound method Fox.walk of <__main__.Fox object at 0x030F2910>>
使用方法3: 顯示當(dāng)前對(duì)象的所有屬性 以及 顯示當(dāng)前對(duì)象所有繼承關(guān)系
import utils
utils.ObjectAttrs.show(Fox())
# 輸出結(jié)果
<__main__.Fox object at 0x02ED2B50>
__class__                                                   <type 'type'>                                               <class '__main__.Fox'>
__delattr__                                                 error
__dict__                                                    <type 'dict'>                                               {'name': 'aurora fox', 'actions': <__main__.FoxManager object at 0x02ED2F50>, 'sex': 'male'}
__format__                                                  <type 'builtin_function_or_method'>                         <built-in method __format__ of Fox object at 0x02ED2B50>
__getattribute__                                            error
__hash__                                                    error
__init__                                                    <type 'instancemethod'>                                     <bound method Fox.__init__ of <__main__.Fox object at 0x02ED2B50>>
__module__                                                  <type 'str'>                                                __main__
__new__                                                     <type 'builtin_function_or_method'>                         <built-in method __new__ of type object at 0x51FA68B8>
__reduce__                                                  <type 'builtin_function_or_method'>                         <built-in method __reduce__ of Fox object at 0x02ED2B50>
__reduce_ex__                                               <type 'builtin_function_or_method'>                         <built-in method __reduce_ex__ of Fox object at 0x02ED2B50>
__repr__                                                    error
__setattr__                                                 error
__sizeof__                                                  <type 'builtin_function_or_method'>                         <built-in method __sizeof__ of Fox object at 0x02ED2B50>
__str__                                                     error
__subclasshook__                                            <type 'builtin_function_or_method'>                         <built-in method __subclasshook__ of type object at 0x02ED9968>
__weakref__                                                 <type 'NoneType'>                                           None
actions                                                     <class '__main__.FoxManager'>                               <__main__.FoxManager object at 0x02ED2F50>
name                                                        <type 'str'>                                                aurora fox
run                                                         <type 'instancemethod'>                                     <bound method Fox.run of <__main__.Fox object at 0x02ED2B50>>
sex                                                         <type 'str'>                                                male
sleep                                                       <type 'instancemethod'>                                     <bound method Fox.sleep of <__main__.Fox object at 0x02ED2B50>>
walk                                                        <type 'instancemethod'>                                     <bound method Fox.walk of <__main__.Fox object at 0x02ED2B50>>





<class '__main__.Fox'> inherited by <__main__.Fox object at 0x02ED2B50>
__class__                                                   <type 'type'>                                               <type 'type'>
__delattr__                                                 <type 'wrapper_descriptor'>                                 <slot wrapper '__delattr__' of 'object' objects>
__dict__                                                    <type 'dictproxy'>                                          {'__module__': '__main__', '__doc__': None, '__init__': <function __init__ at 0x02ECBCB0>}
__format__                                                  error
__getattribute__                                            <type 'wrapper_descriptor'>                                 <slot wrapper '__getattribute__' of 'object' objects>
__hash__                                                    <type 'wrapper_descriptor'>                                 <slot wrapper '__hash__' of 'object' objects>
__init__                                                    <type 'instancemethod'>                                     <unbound method Fox.__init__>
__module__                                                  <type 'str'>                                                __main__
__new__                                                     <type 'builtin_function_or_method'>                         <built-in method __new__ of type object at 0x51FA68B8>
__reduce__                                                  error
__reduce_ex__                                               error
__repr__                                                    <type 'wrapper_descriptor'>                                 <slot wrapper '__repr__' of 'object' objects>
__setattr__                                                 <type 'wrapper_descriptor'>                                 <slot wrapper '__setattr__' of 'object' objects>
__sizeof__                                                  error
__str__                                                     <type 'wrapper_descriptor'>                                 <slot wrapper '__str__' of 'object' objects>
__subclasshook__                                            <type 'builtin_function_or_method'>                         <built-in method __subclasshook__ of type object at 0x02ED9968>
__weakref__                                                 <type 'getset_descriptor'>                                  <attribute '__weakref__' of 'Base' objects>
run                                                         <type 'instancemethod'>                                     <unbound method Fox.run>
sleep                                                       <type 'instancemethod'>                                     <unbound method Fox.sleep>
walk                                                        <type 'instancemethod'>                                     <unbound method Fox.walk>





<class '__main__.Base'> inherited by <class '__main__.Fox'>
__class__                                                   <type 'type'>                                               <type 'type'>
__delattr__                                                 <type 'wrapper_descriptor'>                                 <slot wrapper '__delattr__' of 'object' objects>
__dict__                                                    <type 'dictproxy'>                                          {'__module__': '__main__', 'run': <function run at 0x02ECBBB0>, 'walk': <function walk at 0x02ECBBF0>, 'sleep': <function sleep at 0x02ECBC30>, '__dict__': <attribute '__dict__' of 'Base' objects>, '__weakref__': <attribute '__weakref__' of 'Base' objects>, '__doc__': None}
__format__                                                  error
__getattribute__                                            <type 'wrapper_descriptor'>                                 <slot wrapper '__getattribute__' of 'object' objects>
__hash__                                                    <type 'wrapper_descriptor'>                                 <slot wrapper '__hash__' of 'object' objects>
__init__                                                    <type 'wrapper_descriptor'>                                 <slot wrapper '__init__' of 'object' objects>
__module__                                                  <type 'str'>                                                __main__
__new__                                                     <type 'builtin_function_or_method'>                         <built-in method __new__ of type object at 0x51FA68B8>
__reduce__                                                  error
__reduce_ex__                                               error
__repr__                                                    <type 'wrapper_descriptor'>                                 <slot wrapper '__repr__' of 'object' objects>
__setattr__                                                 <type 'wrapper_descriptor'>                                 <slot wrapper '__setattr__' of 'object' objects>
__sizeof__                                                  error
__str__                                                     <type 'wrapper_descriptor'>                                 <slot wrapper '__str__' of 'object' objects>
__subclasshook__                                            <type 'builtin_function_or_method'>                         <built-in method __subclasshook__ of type object at 0x02ED95B8>
__weakref__                                                 <type 'getset_descriptor'>                                  <attribute '__weakref__' of 'Base' objects>
run                                                         <type 'instancemethod'>                                     <unbound method Base.run>
sleep                                                       <type 'instancemethod'>                                     <unbound method Base.sleep>
walk                                                        <type 'instancemethod'>                                     <unbound method Base.walk>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,794評(píng)論 25 709
  • 跟孩子的聊天經(jīng)常是在晚飯的餐桌上。今天也不例外。兒子又跟我們說(shuō)起他學(xué)校的趣事,主題是關(guān)于英語(yǔ): 那天我跟蘭浩聊起了...
    左左_88閱讀 233評(píng)論 0 0
  • 再濃烈的感情,終有一日會(huì)歸于平淡。我們的虛擬愛(ài)情也不例外。 轟轟烈烈誠(chéng)然可貴,可細(xì)水長(zhǎng)流的溫潤(rùn)更讓人舒服。 早上起...
    明初的日記本閱讀 314評(píng)論 0 0
  • 很多人,每天都在重復(fù),在這個(gè)重復(fù)的生活當(dāng)中,漸漸的忘卻了當(dāng)初的目標(biāo),失去了當(dāng)初的斗志,更有甚者認(rèn)為這就是人生!20...
    赤腳大爺閱讀 325評(píng)論 0 1

友情鏈接更多精彩內(nèi)容