
class OA: def __init__(self, app_id, app_secret): self.client = self.get_client(app_id, app_secret) def get_client(self, app_id, app_secret): return 'CLIENT' class Form(OA): """ 表单相关的方法 """ def get_data(self): return 'self.client.get("xxxx")' class Process(OA): """ 审批流程相关的方法 """ def get_data(self): return 'self.client.get("xxxx")' 最近在做 OA ,数据分为两大块,一块表单,一块流程。
我想初始化一个 OA 对象
然后调用 oa.form.get_data 来查询表单数据
调用 oa.process.get_data 来查询流程数据
父类调用子类的方法,网上查了很多 差不到
1 GlobalNPC 2022-09-25 18:54:47 +08:00 via iPhone 可以实现 但是不允许 换个思路吧 |
2 lozzow 2022-09-25 19:00:17 +08:00 可以实现,但是你这个因该是用组合而不是继承把 |
5 GlobalNPC 2022-09-25 20:15:06 +08:00 |
6 deplivesb 2022-09-25 21:17:58 +08:00 按照你的需求,应该是 OA 继承 Form 和 Process 呀 |
7 joApioVVx4M4X6Rf 2022-09-26 09:21:03 +08:00 用元类实现。继承该父类的子类,能够被元类发现,然后写一个方法根据传进来的参数找到不同的子类,最后调用 |
8 filwaline 2022-09-26 09:38:39 +08:00 组合其实你已经在用了,你在 OA 里声明了的 client 属性,这就是一种组合。同理,你不需要让 Form 去继承 OA ,而是要直接在 OA 里初始化一个 form 属性,这样就直接能够实现调用 oa.form.get_data 你这里指定 Form 去继承 OA ,是图什么?省掉两行代码?还是你以为继承会让 Form 自动注册到 OA 里去? |
9 filwaline 2022-09-26 09:41:52 +08:00 @v2exblog metaclass 可太特么黑魔法了,菜鸟去折腾这个怎么死的都不知道。组合通常优于继承,代码应该保持简单直观。 |
10 fkdtz 2022-09-26 14:21:31 +08:00 沿着你的思路的话,不需要上面的继承关系,而应该把 Form 和 Process 对象 set 到 OA 里面,让 OA 持有这些个实例。 |
11 TwoCrowns 2022-09-26 17:26:40 +08:00 我理解写个依赖注入不就行了吗? |
12 fzzff 2022-10-19 16:33:59 +08:00 简单工厂设计模式 |