【问题标题】:What's the best style, class method or global function? [closed]最好的风格、类方法或全局函数是什么? [关闭]
【发布时间】:2012-09-03 21:43:18
【问题描述】:

我经常编写一个类,以及与该类密切相关的辅助函数。对于我目前的情况,一个 Window 类用于包装一些 win32api 调用,以及用于查找窗口的函数。这些辅助函数应该是给定模块中的全局函数,还是应该是 Window 类的类方法。也就是说,我应该在我的模块中拥有:

class Window(object):
    def __init__(self, handle): 
        self.handle = handle
        ...
    ...
    @classmethod
    def find_windows(cls, params):
        handles = ...
        return map(cls, handles)

用法是:

from window import Window
windows = Window.find_windows("Specialty")

或者我应该这样做:

class Window(object):
    def __init__(self, handle): 
        self.handle = handle
        ...
    ...

def find_windows(params):
    handles = ...
    return map(Window, handles)

用法是:

from window import Window, find_windows
windows = find_windows("Speciality")

更简洁地说:分组应该在类级别(例如,它们将是 Java 中的静态方法)还是在模块级别?

【问题讨论】:

    标签: python class coding-style module


    【解决方案1】:

    第一种方法的优点是,如果您将Window 子类化,您可以覆盖您的find_windows 方法(与java 中的静态方法不同)。但是,这只有在覆盖最终有意义的情况下才有用,否则我认为将它作为一个函数看起来会更好。

    编辑:如果您有多种查找 Window 对象的方法,那么有一个名为 WindowFinder 或 WindowManager 的附加类会封装查询/查找逻辑。

    这是 django 中使用的一种模式,如果你的 Window 类是一个 db 模型,那么你就有 Window.objects 指向一个 WindowManager。窗口管理器具有构建 sql 查询的方法。

    然后,您可以执行以下操作:

    Window.objects.all()
    

    Window.objects.filter(name="Speciality")
    

    【讨论】:

    • 啊,我认为单独的“finder”类实际上是我想要做的;感谢您提醒我 django 的方式
    【解决方案2】:

    如果find_windows() 不需要访问或了解您的Window 类的内部工作原理,我会将其设为全局函数。增加不同代码段之间的依赖关系几乎没有什么好处,尤其是当它基本上只是源位置的问题时。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您的 find_windows 函数会从句柄列表中创建 Window 实例列表。

      它表现为一个构造函数,因此,我会将它设为一个函数,而不是Window 类的classmethod。正如我在评论中提到的那样,这样感觉更自然,但这只是一种预感。

      编辑

      @Ioan Alexandru Cucu 的回答让我思考您将Window 子类化为SubWindow 的情况。 如果find_windows(或建议的create_windows)是classmethod,它将返回SubWindow 实例的列表,而如果它是我建议的独立函数,它只会返回Window 实例。

      这可以被认为是一个有趣的功能,因此将find_windows 保留为classmethod 是有意义的。我仍然会在文档字符串或其他地方发表某种评论来解释理由。

      <tl;dr>: 这取决于

      【讨论】:

      • 你能详细说明这个理由吗?为什么它是构造函数意味着它应该是函数而不是类方法?
      • 在实践中,find_window 是函数还是类方法并不重要,结果是一样的。从 OO 的角度来看,我对返回类的新实例的类的方法感到不舒服。唉,这只是一种预感(我没有接受过 OOP 理论的正式培训)......
      • 调用方法 find_windows 听起来并不像涉及构造。我将其命名为 create_windows。 find_windows 听起来像是一种方法/函数,它可以搜索窗口/数据库池或任何东西。
      猜你喜欢
      • 2014-07-04
      • 2011-06-29
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-30
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      相关资源
      最近更新 更多