之前一直困惑於python類在繼承中冗長的參數,經過研究airflow的代碼,發現是可以進行優化的.
Father類有兩個必選參數src,dst,和一個默認參數concurrency,
子類有兩個必選參數target_db, target_tb,在子類的初始化方法__init__中只需要有target_db, target_tb的簽名,其他參數都可以用*args, **kwargs替代
在實際的子類實例化的時候,則需要將子類/父類所有必須參數都初始化,但畢竟子類的初始化方法簡化了很多
class Father(object): def __init__(self, src, dst, concurrency=1, *args, **kwargs): self.src = src self.dst = dst self.concurrency = concurrency self.json_dict = None def print_obj(self): print(self.__dict__) class Son(Father): def __init__(self, target_db, target_tb, *args, **kwargs): super().__init__(*args, **kwargs) self.target_db = target_db self.target_tb = target_tb if __name__ == '__main__': t = Son(src='src', dst='dst', target_db='odoo', target_tb='product') t.print_obj()
如果類參數較多,從一個字典來初始化的時候,可以進行簡化:
if __name__ == '__main__': print(sys.argv[1]) args = transform_params(sys.argv[1]) s=Son(**args)
需要保證字典中包含類的所有必選參數且字典參數key與類參數相同!