为什么要在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
有关。
为什么要把他们赶出课堂?将它们宣布在课堂之外有什么好处?
答案 0 :(得分:3)
最后,对于这个特定的计划,无论采用哪种方式都没有任何好处和劣势。
答案 1 :(得分:3)
Stop Writing Classes PyCon谈话并不完全是关于这个主题的,而是包括我觉得这里有相关课程的内容:基本上,想法是类用于创建对象。所有属性,实例方法和类方法都应该进一步实现创建对象或使对象工作的目标。类不是代码组织(根据这个理论) - 这就是模块的用途。
这是一个非常自以为是的策略,并不是每个人都同意这一点。但是如果你在这个上下文中考虑你的例子,很明显函数不属于类的原因是即使函数被类使用,它们实际上也不会对任何对象进行操作或进一步创建任何对象的直接。它们只是没有绑定到任何特定类的实用函数,理论上可以在库中的其他地方使用。
那么为什么或为什么不把它们放在课堂上呢?它归结为您是否认为类应该用于代码组织。在这种情况下,作者显然认为它是用于代码组织的模块,而不是类。
答案 2 :(得分: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
答案 3 :(得分:1)
如果定义的函数都对对象内的数据进行操作,那么将函数封装到类级别才有意义。另外,看看类是如何调用这些函数的唯一的东西,将它们放在类中是有意义的。
将它们放在类之外的唯一好处是,如果您有其他代码将使用与类本身无关的这些函数。或者,如果您正在构建一些将由其他模块使用的辅助函数。
答案 4 :(得分:0)
通常,在决定放置功能的位置时,重要的是要识别将要使用的功能。如果它们是课程内部的并且不会被程序的其他部分使用,那么将它们放入课堂是有意义的。但如果其他部分很可能会使用它们,那么它们应该处于模块级别。