pythonは親クラスのサブクラス(遍歴、再帰)を取得し、すべてのサブクラスのメソッドをループします.

1820 ワード

前言
新しい仕事を変えて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メソッドでこの属性が実行可能かどうかを判断し、このメソッドを実行します.
三、総括と反省
この方法は私が直すべきで、いつもそれをもっと対象にしたいと思って、ちょうど1つのクラスにカプセル化して、all_subclassesという字断はpropertyとして使われていますが、見ていると違和感があり、同僚がそうしてもよくないと言っていますが、具体的にはどうしてもうまく言えませんでした.もっと大きな原因はpythonに慣れていないのではないかと思います.見てほしい大神たちが改善のアドバイスをしてくれることを望んでいます.