前言
換了新工作,踏足於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的不夠熟悉吧,希望看到的大神們能給提出改進的建議。