2

我经常编写一个类,以及与该类密切相关的辅助函数。对于我目前的情况,一个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 中的静态方法)还是在模块级别?

4

3 回答 3

2

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

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

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

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

Window.objects.all()

或者

Window.objects.filter(name="Speciality")
于 2012-09-03T22:01:10.957 回答
2

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

于 2012-09-03T23:10:26.153 回答
0

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

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

编辑

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

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

<tl;dr>:这取决于

于 2012-09-03T21:52:14.320 回答