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的不够熟悉吧,希望看到的大神们能给提出改进的建议。
python获取父类的子类(遍历,递归),并循环执行所有子类的某一方法的更多相关文章
- C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断
C#保留2位小数几种场景总结 场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...
- 二叉树(前序,中序,后序,层序)遍历递归与循环的python实现
二叉树的遍历是在面试使比较常见的项目了.对于二叉树的前中后层序遍历,每种遍历都可以递归和循环两种实现方法,且每种遍历的递归实现都比循环实现要简洁.下面做一个小结. 一.中序遍历 前中后序三种遍历方法对 ...
- 游标遍历所有数据库循环执行修改数据库的sql命令
MSSQL数据库服务器上有很多类似的数据库,需要将这些数据库统一修改其中的某些表或者某些命令,那么就会想到用游标来遍历. 先来说思路: 1,首先需要查询出所有的数据库: select [name] f ...
- Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性
一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...
- Python 获取类对象的父类
参考 Get parent class name? Python 获取类对象的父类 给定一个类的对象a,要求获取该对象的父类. 方法: a.__class__.__bases__ 返回由该对象的父类组 ...
- python的父类和子类中关于继承的不同版本的写法
Python 2.7中的继承 在Python 2.7中,继承语法稍有不同,ElectricCar 类的定义类似于下面这样: class Car(object): def __init__(self, ...
- Python获取目录、文件的注意事项
Python获取指定路径下的子目录和文件有两种方法: os.listdir(dir)和os.walk(dir),前者列出dir目录下的所有直接子目录和文件的名称(均不包含完整路径),如 >> ...
- 通过反射获取父类中的泛型参数对应的Class对象
假设有两个类:Dao 和 PersonDao,它们的代码如下: Dao: public class Dao<T> { private Class<T> clazz; T get ...
- python中的几种遍历列表的方法比较
python的内容非常丰富,给我们带来的便利很多,很多事情的表达方法有很大的多样性,比如我经常需要遍历一个列表,取它的下标和值,这个时候就有很多方法需要取舍一下才行. for循环遍历 l = [1,2 ...
随机推荐
- Node基础篇(模块和NPM)
核心模块 核心模块的意义 如果只是在服务器运行JavaScript代码,意义并不大,因为无法实现任何功能(读写文件,访问网络). Node 的用处在于它本身还提供的一系列功能模块,用于与操作系统互动. ...
- jQuery图片延迟加载
这里延迟加载的意思是,拖动滚动条时,在图片出现在浏览器显示区域后才加载显示.在这之前全部图片都由一张图片代替.节省流量,减轻服务器负担. 效果展示 http://hovertree.com/texia ...
- C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
前面一篇随笔企业号的一些基础信息,以及介绍如何配置企业号的回调方式实现和企业号服务器进行沟通的桥梁.本篇主要还是继续介绍企业号的开发工作的开展,介绍微信企业号通讯录管理开发功能,介绍其中组织机构里面如 ...
- python学习笔记(基础三:if else流程判断、while循环、for循环)
if else流程判断 getpass在pycharm中无法使用,在命令行窗口中进入python环境可以使用. import getpassusername = input("usernam ...
- 【夯实PHP基础】php开发时遇到白页的调试方法
本文地址 分享提纲: 1. 设置报错报错级别,显示报错 2. 白页的可能原因 1.[设置报错报错级别,显示报错] php开发时,访问地址也对,但就是不出来页面,显示的是 白的页面,所以就可 ...
- 浏览器对localstorage的支持情况以及localstorage在saas系统中的应用实践思考
首先,还是要说,任何一种新特性的引入,通常有着其特有的场景和解决的目标需求,localstorage也一样.在我们的应用场景中,主要在金融业务服务的saas系统.其中涉及很多更改频率很多的元数据的客户 ...
- Cleave.js – 自动格式化表单输入框的文本内容
Cleave.js 有一个简单的目的:帮助你自动格式输入的文本内容. 这个想法是提供一个简单的方法来格式化您的输入数据以增加输入字段的可读性.通过使用这个库,您不需要编写任何正则表达式来控制输入文本的 ...
- iOS之获取经纬度并通过反向地理编码获取详细地址
_locationManager = [[CLLocationManager alloc] init]; //期望的经度 _locationManager.desiredAccuracy = kCLL ...
- 安装cocoapods以及更新cocoapods
安装 1.设置ruby的软件源 这是因为ruby的软件源rubygems.org因为使用亚马逊的云服务,被我天朝屏蔽了,需要更新一下ruby的源,过程如下: gem sources -l #(查看当前 ...
- MVC下压缩输入的HTML内容
在MVC下如何压缩输出的HTML代码,替换HTML代码中的空白,换行符等字符? 1.首先要了解MVC是如何输出HTML代码到客户端的,先了解下Controller这个类,里面有很多方法,我们需要的主要 ...