gpt4 book ai didi

python - 哪个更像 pythonic,工厂是作为模块中的函数,还是作为它创建的类的方法?

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:05 26 4
gpt4 key购买 nike

我有一些 Python 代码可以根据从 iCalendar 文件中解析的 VEvent 对象创建日历对象。

日历对象只有一个方法可以在解析事件时添加事件。

现在我想创建一个工厂函数,用于根据文件对象、路径或 URL 创建日历。

我一直在使用 iCalendar python module ,它直接在返回实例的类上实现工厂函数作为类方法:

cal = icalendar.Calendar.from_string(data)

据我对 Java 的了解,这是 Java 代码中的一种常见模式,尽管我似乎发现更多的工厂方法引用在不同的类上,而不是您实际想要从中实例化实例的类。

问题是,这也被认为是 Pythonic 吗?还是仅仅创建一个模块级方法作为工厂函数被认为更符合 Python 风格?

最佳答案

[注意。将“日历”(一系列事件)与“事件”(日历上的单个事件)分开时要非常谨慎。在你的问题中,似乎有些困惑。]

工厂设计模式有很多变体。

  1. 一个独立的便利函数(例如,calendarMaker(data))

  2. 构建您的目标类 (Calendar) 的单独类(例如 CalendarParser)。

  3. 类级方法(例如 Calendar.from_string)方法。

它们有不同的用途。所有都是 Pythonic,问题是“你是什么意思?”和“什么可能会改变?”意义就是一切;改变很重要。

便利函数是 Pythonic 的。像 Java 这样的语言不能有自由 float 的功能;你必须在一个类中包装一个孤独的功能。 Python 允许您拥有一个单独的函数,而无需类的开销。当您的构造函数没有状态更改或替代策略或任何先前操作的内存时,函数是相关的。

有时人们会定义一个类,然后提供一个方便的函数来创建该类的实例,为状态和策略以及任何其他配置设置常用参数,然后调用该类的单个相关方法。这为您提供了类的状态性和独立函数的灵 active 。

使用了类级别的方法模式,但它有局限性。第一,它被迫依赖类级变量。由于这些可能令人困惑,当您需要添加功能(如有状态或替代策略)时,作为静态方法的复杂构造函数会遇到问题。请确保您永远不会扩展静态方法。

第二,它与其余的类方法和属性或多或少无关。这种 from_string 只是 Calendar 对象的众多替代编码之一。您可能有一个 from_xmlfrom_JSONfrom_YAML 等等。这些都与 Calendar 是什么或它做什么无关。这些方法都是关于如何对日历进行编码以进行传输的。

您将在成熟的 Python 库中看到的是,工厂与其创建的对象是分开的。编码(如字符串、XML、JSON、YAML)会受到或多或少的大量随机变化的影响。然而,本质的东西很少改变。

将两个问题分开。使编码和表示尽可能远离状态和行为。

关于python - 哪个更像 pythonic,工厂是作为模块中的函数,还是作为它创建的类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/115764/

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