【问题标题】:What's the advantage to define some function out of class in python program [closed]在python程序中定义一些类外函数有什么好处[关闭]
【发布时间】:2013-05-16 14:33:11
【问题描述】:

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

例如,following project on 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 类有关系。

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

【问题讨论】:

  • 扭转局面:把它们放在课堂上会有什么好处?
  • @MartijnPieters 封装。
  • @GeorgeStocker:如果函数与实例状态无关怎么办?
  • @MartijnPieters 然后我会将它们放在另一个文件中,或者将它们放在有意义的地方。这是我的 C# 开发人员。对我来说奇怪的是看到函数无处可挂,很难确定它们处理的是系统的哪个部分。
  • @GeorgeStocker:对。但是 Python 更灵活一些。您经常会发现私有帮助函数捆绑在同一个模块中;那是它们被使用的地方,但它们不对类的状态进行操作,因此它们被定义为类之外的单独函数。这使课程本身保持整洁。

标签: python class function


【解决方案1】:

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

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

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

【讨论】:

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

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

    【讨论】:

    • 是的,对我来说。我将它们放在类中并定义为静态方法。
    【解决方案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
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 是的,我想过,我认为这些功能是属于类的,不会被类外的其他人使用。所以我怀疑为什么要定义课外
        猜你喜欢
        • 1970-01-01
        • 2011-10-11
        • 2012-11-30
        • 2010-09-12
        • 2012-04-28
        • 2022-01-08
        • 2010-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多