Python中的类默认从object作为继承的开始
__init__会承载一些公共定义,如果在类中定义__init__就表名如果调用该类,就必须传入与之相匹配的参数
init方法的第一个参数永远都是self,表示创建实例本身,在__init__方法内部,可以把各种属性绑定到self,因为self指向创建的实例本身
init里指定了啥就传啥,BaseViz中是这么定义的:def __init__(self, datasource, form_data):说明必须传datasource 和 form_data
子类的的方法如果和父类的方法重名,子类会覆盖掉父类。所以TableViz里重写的query_obj/get_data/json_dumps三个方法会覆盖BaseViz里的三个同名方法
@property是Python中的黑魔法,廖雪峰黑魔导师已经讲明白了。
在BaseViz类的__init__方法中主要的工作应该是从传来的form_data中摘取一些信息供给后面使用。
get_extra_filters
调用过程经过缓存相关方法后,进入到get_extra_filters方法。其实触发这里是因为后面的query_obj方法,作用是取出在前端用Filter Box做数据筛选交互的时候产生的查询,当我们在前端操作筛选框,会看到实时的数据视图刷新,整个交互过程中,筛选的行为也是通过form_data传递,到后端从这里解析出来
TableViz::query_obj
解读BaseViz的query_obj后,紧接着看在TableViz中重写的query_obj,我原来以为子类会覆盖掉父类中的同名方法,但是在该方法一开始用到了super(),所以魔幻故事发生了,这里的同名方法其实是对父类的调用,不是覆盖。
super(TableViz, self).query_obj()代表直接调用父类中的query_obj(),在父类返回d的基础上,对d做二次修改
TableViz::get_data
在TableViz的get_data方法中,将已经获得的dataframe组合成了dict形式,这一步就将dataframe样式的数据组装成了类似于JSON结构的数据了:
get_payload
在数据查询交互的过程中,都会经由get_payload优先从缓存查询,所有查询的数据也将通过get_payload组织成特定的结构入缓存。最终payload将会是返回到前端的结果