gpt4 book ai didi

python - 在 python 中编写类时,首选 mixins 还是对象属性?

转载 作者:行者123 更新时间:2023-11-30 21:58:49 26 4
gpt4 key购买 nike

当从多个类组合函数时,我看到使用了以下两种约定:Data1 使用 mixins 直接向子类添加方法,而 Data2 实例化属性对象做这项工作。

我认为它们是等效的,并且选择只是风格之一。是对的吗?还是其中一个优先于另一个?

class Data1(Reader, Processor, Writer):
def __init__(self):
Reader.__init__(self)
Processor.__init__(self)
Writer.__init__(self)

def run(self):
self.read()
self.process()
self.write()

class Data2:
def __init__(self):
self.reader = Reader()
self.processor = Processor()
self.writer = Writer()

def run(self):
self.reader.read()
self.processor.process()
self.writer.write()

为了刷新一个特定的示例,我有一个处理管道,其中有各种数据产品,每个数据产品都需要读取(Reader.read())、处理(Processor.process ()),然后需要将处理步骤的结果写入数据库(Writer.write())。

更具体地说,考虑我有多种健身数据类型:

  1. 来自 csv 文件的心率数据需要计算平均值1 秒间隔并转储到数据库中的心率表
  2. 来自 json 文件的运行速度数据需要转换为mi/hr,然后格式化为 html 报告的一部分。
  3. 天气数据来自需要在一天内聚合的 Web api,然后发布到另一个网络 API。

对于每个“数据产品”,都有一个逻辑读取处理写入管道,我想捕获它位于一个抽象类中,然后可以用作处理 future “数据产品”的一致模板。

在这些示例中,Reader.read() 将是一个可能读取 csv、json 或 Web API 的抽象类。 Processor.process() 执行各种聚合。 Writer.write() 会将处理后的数据发送到各个地方。

鉴于此,我不确定最佳结构。

最佳答案

我想避免使用宗教,因为你可以找到使用其中之一的技术原因,但经验法则是问这个问题是 A a B 还是 A 有 B? 在前一种情况下你应该使用继承,在后一种情况下你应该使用继承。

例如,一个彩色方 block 一个图形并且一种颜色。所以它应该继承自figure并包含颜色。可能有一些提示:如果子对象之一具有独立的生命周期(它可能在组合对象中使用之前就存在),那么它毫无疑问是具有关系。另一方面,如果它不能单独存在(抽象类),那么毫无疑问是**是*关系。

但这意味着,如果不知道什么是 ReaderWriterProcessor 以及数据是什么,我就无法说出哪种模型我会用。但是,如果 Reader 和 Writer 都是具有独立父成员的同一祖先类的子类,我将使用组合。如果它们是专门定制的类,共享共同祖先的成员,那么这将更像是一个操作,我将使用继承。

规则是,如果可能的话,您应该尊重真实对象的语义。毕竟,在深度代码执行中,使用继承还是组合并不重要。

<小时/>

顺便说一句,上面讨论的是一般的继承与组合问题。严格来说,一个mixin是一种特殊情况,因为 mixin 不应该维护任何状态,而只能添加方法,并且因此通常是抽象的。在Python中,mixin是通过继承实现的,但其他语言可能有其他实现。但在 Python 中,它们是不一定是关系但确实使用继承的典型示例。

关于python - 在 python 中编写类时,首选 mixins 还是对象属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54797836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com