类继承及调用问题

2022-09-25 18:48:39 +08:00
 911061873
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 来查询流程数据

父类调用子类的方法,网上查了很多 差不到

1896 次点击
所在节点    Python
12 条回复
infun
2022-09-25 18:54:47 +08:00
可以实现 但是不允许 换个思路吧
lozzow
2022-09-25 19:00:17 +08:00
可以实现,但是你这个因该是用组合而不是继承把
911061873
2022-09-25 19:50:20 +08:00
@lozzow 组合是什么?
911061873
2022-09-25 19:51:04 +08:00
@infun 能否提供下思路?
infun
2022-09-25 20:15:06 +08:00
@911061873

类是抽象的模板

表单和流程能抽象出来的共性的东西放到 OA 类里面,
其他没有共性的,就在各自的类里面去写子类属性和子类方法
deplivesb
2022-09-25 21:17:58 +08:00
按照你的需求,应该是 OA 继承 Form 和 Process 呀
0x0208v0
2022-09-26 09:21:03 +08:00
用元类实现。继承该父类的子类,能够被元类发现,然后写一个方法根据传进来的参数找到不同的子类,最后调用
filwaline
2022-09-26 09:38:39 +08:00
组合其实你已经在用了,你在 OA 里声明了的 client 属性,这就是一种组合。同理,你不需要让 Form 去继承 OA ,而是要直接在 OA 里初始化一个 form 属性,这样就直接能够实现调用 oa.form.get_data

你这里指定 Form 去继承 OA ,是图什么?省掉两行代码?还是你以为继承会让 Form 自动注册到 OA 里去?
filwaline
2022-09-26 09:41:52 +08:00
@v2exblog metaclass 可太特么黑魔法了,菜鸟去折腾这个怎么死的都不知道。组合通常优于继承,代码应该保持简单直观。
fkdtz
2022-09-26 14:21:31 +08:00
沿着你的思路的话,不需要上面的继承关系,而应该把 Form 和 Process 对象 set 到 OA 里面,让 OA 持有这些个实例。
TwoCrowns
2022-09-26 17:26:40 +08:00
我理解写个依赖注入不就行了吗?
fzzff
2022-10-19 16:33:59 +08:00
简单工厂设计模式

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/882834

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX