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

  • 相关阅读:
    根据坐标点画图形
    js 解析geojson格式
    devexpress 安装
    DataTable 获取列名
    ADO.NET 注册
    css:outline
    javascript函数sort
    引用类型-2015/10/06
    2015-11-02-js
    jquery
  • 原文地址:https://www.cnblogs.com/lip0121/p/5244159.html
Copyright © 2020-2023  润新知