python獲取父類的子類(遍歷,遞歸),並循環執行所有子類的某一方法


前言

換了新工作,踏足於python語言的開發,也把自己的學習過程記錄下來。

一,遞歸獲取某一父類的所有子類

all_subclasses = {'0': '0'}


def get_all_classes(model):
"""
獲取父類的所有子類
"""

for subclass in model.__subclasses__():
# print(subclass._meta.abstract)
if (not (subclass.__name__) in all_subclasses.keys()) and (not subclass._meta.abstract):
all_subclasses[subclass.__name__] = subclass
get_all_classes(subclass)
return all_subclasses

  這里主要用到了__subclasses__() 這個方法,這個方法返回的是這個類的子類的集合,用遞歸的方法,去獲取傳入類型的所有子類。返回給全局變量 all_subclasses這個字典集合。

二,遍歷子類集合,執行某一方法

def do_collection(model=None, date=None):
    """
    執行收集數據的方法
    """
    allclasses = get_all_classes(StatBaseModel)
    if date:
        date = datetime.date.today() + datetime.timedelta(days=-1)
    if model:
        fn_collect = getattr(allclasses[model], 'collect', None)
        if callable(fn_collect):
            fn_collect(date)
        print("執行{0}的collect 方法".format(model))
        return
    for item, value in allclasses.items():
        fn_collect = getattr(value, 'collect', None)
        if callable(fn_collect):
            fn_collect(date)
            print("執行{0}的collect 方法".format(item))

  通過getattr()這個方法獲取類型的某一個屬性,然后通過callback方法判斷這個屬性是不是可執行的,然后執行這個方法。

三,總結和反思

這個方法我該來改去的,總是想把它搞得更面向對象些,剛開始封裝成了一個類,把all_subclasses這個字斷作為一個property,但是看着是很別扭,同事說那樣做也不是很好,但是具體怎么不好也沒說出來,我想更大的一個原因是還是我對python的不夠熟悉吧,希望看到的大神們能給提出改進的建議。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM