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

时间: 2024-10-13 13:47:13

python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法的相关文章

二叉树前中后序遍历递归转循环

通过观察递归实现,用循环和栈模拟递归实现中结点入栈和出栈的过程. #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl using namespace std; typedef long long LL; struct Node { int val; Node *left, *right; Node() : left(NULL), ri

Linux定时循环执行python脚本

本文主要介绍在linux环境下,定时循环执行python脚本的两种方法. 方法一: nohup vim time.py 1 import time 2 while(True): 3 #time.sleep(1) 4 with open('time.log', 'a+') as logfile: 5 logfile.write('Hello, World!\n') 6 time.sleep(1) 7 #break 在终端运行如下命令 nohup python time.py & 功能:实现了每秒将

Python中父类和子类间类属性(非实例属性)的设置获取的传递

前几天做一个项目,遇见类似这样一个问题.父类是个公用类,很多子项目中都运用到了,而子类也要作为一个基本类在该项目中的很多地方都要用到,但是的原始父类里面有些类属性(注意这里是类属性,不是实力属性).在程序运行时候要进行重新设置. 背景:Python中父类的类属性,类方法,实力属性都能够被子类继承,实力属性的再设置很简单,当然为了控制类属性的访问权限(Python中不能完全实现控制),也可以用@preproty装饰符优化和控制实力属性的设置,父类的类属性被子类继承,可以很容易的获得父类属性的内容,

Python获取目录、文件的注意事项

Python获取指定路径下的子目录和文件有两种方法: os.listdir(dir)和os.walk(dir),前者列出dir目录下的所有直接子目录和文件的名称(均不包含完整路径),如 >>> os.listdir(r'E:')['$RECYCLE.BIN', 'BaiduYunDownload', 'cabspottingdata', 'cabspottingdata.tar.gz', 'data', 'MyDownloads', 'System Volume Information'

如果Google面试让你用python写一个树的遍历程序

前几天忽然对python很感兴趣,学了几天也感觉它非常的简洁实用.打破了我这么长时间对java C# C 和vb的审美疲劳,让我眼前一亮."就像读英文一样简单"这句话评价python说的很合理. 我对python的好感很大部分是因为听说google很多程序用python,而且在google app engine里面和支持python.如果你去google面试或者笔试,很可能就会考到这个题:用python实现树的遍历. 自己试着写了一下,不过毕竟是菜鸟,有问题请多多指教. 运行效果如下:

05-XML遍历递归显示到TreeView上(XDocument类)

1.XML文件(x1.xml): <?xml version="1.0" encoding="utf-8" ?> <itcast> <itcastNet> <net0405> <student id="cz001"> <name>张三</name> <age>18</age> <gender>Male</gender>

java中为什么不能通过getClass().getName()获取父类的类名

例如: class A{} public class B extends A{ public void test(){ System.out.println(super.getClass().getName()); } publis static void main(String[] args){ new B().test(); //得到的输出结果为B,而不是A //可以通过this.getClass.getSuperclass().getName()获取父类类名(java的反射机制) } }

python获取火狐浏览器的历史记录

python获取火狐浏览器的历史记录 最新在学习python,所以想着做一些练手的项目,这里做一个获取火狐浏览器的历史记录,然后保存到一个txt文件中.这里涉及到的库: os sqlite3 time os库用来搜索文件,sqlite3用来读取sqlite文件,time用来转换时间戳使用. 火狐的历史记录是使用sqlite来保存的,Python内置sqlite3库,所以并不需要安装任何第三方库. 首先是查找火狐浏览器places.sqlite历史记录文件,这里使用了os.walk()函数来查找,

python获取微信公共平台消息列表和用户头像

转载需注明原文地址:http://blog.csdn.net/btyh17mxy/article/details/25207889 刚写的模拟登陆的方式从获取微信公众平台消息列表和用户头像的库,之后还会继续增加相关功能,github地址https://github.com/btyh17mxy/wxwall #!/usr/bin/env python # coding: UTF-8 import json import hashlib import re import random import