什么';在python程序中定义一些类外函数的优点是什么

什么';在python程序中定义一些类外函数的优点是什么,python,class,function,Python,Class,Function,为什么函数应该在Python中使用的类之外声明 例如,通过其\u散列、\u任务行和\u任务行函数执行此操作。格式如下所示: 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.prefi

为什么函数应该在Python中使用的类之外声明

例如,通过其
\u散列
\u任务行
\u任务行
函数执行此操作。格式如下所示:

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
有关


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

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

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

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

  • 它们比成员函数更易于导入且名称更短
  • 即使您将它们放在类中,它们也可能是一个classmethod/staticmethod
  • Pythonic代码使用duck类型;方法意味着它只能与该类一起使用,而实际上代码可能比该类更通用
  • 个人偏好。有些人喜欢将“域模型”和“业务逻辑”分开
  • 最后,对于这个特定的程序,无论采用哪种方式,都没有任何好处或坏处。

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

    这是一种非常固执己见的策略,并非所有人都同意。但是,如果您在本文中思考您的示例,很明显,函数不属于类的原因是,即使类使用函数,它们实际上也不会对任何对象进行操作,也不会直接进一步创建任何对象。它们只是没有绑定到任何特定类的实用函数,理论上可以在库中的其他地方使用


    那么为什么或者为什么不把他们放在课堂上呢?它归结为您是否认为类应该用于代码组织。在本例中,作者显然接受了这样一种观点,即模块用于代码组织,而不是类。

    函数的性能优势很小

    >>> 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
    

    是的,我认为,我认为函数是属于类的,不会被其他人用在类外。因此,我怀疑为什么要定义类外?反过来说:将它们放在类中有什么好处?@MartijnPieters封装。@GeorgeStocker:如果函数与实例状态无关怎么办?@MartijnPieters,那么我会将它们放在另一个文件中,或者放在有意义的地方。这是我身上的C#开发者。对我来说,奇怪的是看到函数在任何地方都挂不住,这使得很难确定它们处理的是系统的哪个部分。@GeorgeStocker:对。但是Python更灵活一些。您经常会发现在同一模块中捆绑了私有助手函数;这就是它们被使用的地方,但是它们不在类的状态上操作,所以它们被定义为类外的独立函数。这样可以保持课堂的整洁。是的,对我来说。我将把它们放在类中并定义为staticmethod。