6

为什么要在 Python 中使用的类之外​​声明函数?

例如,Github 上的以下项目使用其_hash_task_from_taskline_tasklines_from_tasks函数来执行此操作。格式与以下相同:

class UnknownPrefix(Exception):
"""Raised when trying to use a prefix that does not match any tasks."""
def __init__(self, prefix):
    super(UnknownPrefix, self).__init__()
    self.prefix = prefix


def _hash(text):

    return hashlib.sha1(text).hexdigest()

def _task_from_taskline(taskline):
    """
    snipped out actual code
    """
    return task

def _tasklines_from_tasks(tasks):
    """Parse a list of tasks into tasklines suitable for writing."""


    return tasklines

但我认为这些功能与类有关系TaskDict

为什么要把他们赶出课堂?在课堂之外声明它们有什么好处?

4

5 回答 5

3
  1. 它们比成员函数更容易导入并且名称更短
  2. 即使您将它们放在类中,它们也可能无论如何都会成为类方法/静态方法。
  3. Pythonic 代码使用鸭子类型;一个方法意味着它只能与该类一起使用,而实际上代码可能比这更通用。
  4. 个人喜好。有些人喜欢将“领域模型”和“业务逻辑”分开。

最后,对于这个特定的程序,无论哪种方式都没有好处也没有坏处。

于 2013-05-16T14:45:47.127 回答
3

停止编写类PyCon的演讲并不完全是关于这个主题,但包括我认为相关的课程:基本上,这个想法是类是用于创建对象的。所有的属性、实例方法和类方法都应该进一步实现创建对象或使对象工作的目标。类不是用于代码组织(在这个理论下)——这就是模块的用途。

这是一个非常自以为是的策略,并不是每个人都同意它。但是,如果您在这种情况下考虑您的示例,很明显,这些函数不是类的一部分的原因是,即使这些函数被类使用,它们实际上并不对任何对象进行操作或进一步创建任何对象直接。它们只是未绑定到任何特定类的实用函数,理论上可以在库的其他地方使用。

那么为什么或者为什么不把他们放在课堂上呢?归结为您是否认为应该将类用于代码组织。在这种情况下,作者显然接受了模块用于代码组织而不是类的想法。

于 2013-05-16T15:09:59.853 回答
3

函数具有较小的性能优势

>>> import timeit
>>> timeit.Timer('foo()', 'def foo(): return 1').timeit()
0.09944701194763184
>>> timeit.Timer('A.foo()', '''
... class A(object):
...     @staticmethod
...     def foo():
...         return 1''').timeit()
0.12048101425170898
于 2013-05-16T15:34:47.060 回答
1

如果定义的函数都对对象内的数据进行操作,那么只有将函数封装到类级别才有意义。此外,看看类是如何调用这些函数的唯一东西,将它们放在类中是有意义的。

将它们放在类之外的唯一好处是,如果您有其他代码将使用这些与类本身无关的函数。或者,如果您正在构建一些将被其他模块使用的辅助函数。

于 2013-05-16T14:44:06.843 回答
0

通常,在决定将函数放置在何处时,重要的是要识别将要使用函数的内容。如果它们在类内部并且不会被程序的其他部分使用,那么将它们放在类中是有意义的。但是如果其他部分很可能会使用它们,它们应该在模块级别。

于 2013-05-16T14:39:03.663 回答