zoukankan      html  css  js  c++  java
  • 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的不够熟悉吧,希望看到的大神们能给提出改进的建议。

  • 相关阅读:
    微信小程序开发---各代码文件简介
    LeetCode71. 简化路径
    LeetCode70. 爬楼梯
    LeetCode69. x 的平方根
    LeetCode68. 文本左右对齐
    LeetCode剑指 Offer 09. 用两个栈实现队列
    LeetCode67. 二进制求和
    LeetCode66. 加一
    LeetCode65. 有效数字
    LeetCode64. 最小路径和
  • 原文地址:https://www.cnblogs.com/lip0121/p/5244159.html
Copyright © 2011-2022 走看看