在边缘编程案例

时间:2015-07-12 23:18:12

标签: python function class oop

有时在编写python软件时,我最终会遇到一种情况,即我不确定是使用带有子函数的函数,还是只使用类。在这些情况下,我有一系列不同的输入,我想对它们应用一些变换,然后产生一个不同的输出。而且我不太关心从输入到输出过程中创建的任何变量。所以感觉它应该是一个简单的功能,而不是一个类。但是对于这些情况,它也涉及相当复杂的一系列操作,通常需要子函数,这些子函数仅在将输入转换为输出的过程中有用,而不是更普遍的意义。

在一天结束时,我通常只想使用:

来调用它
output = my_function(input)

所以我可以做类似

的事情
def my_function(input):
    def subfunc1(blah):
        return blah1output
    def subfunc2(blah):
        return blah2output
    #lots of complex code here that calls subfunc1 and subfunc2
    return output

但是,然后同事X可能会说,哇,看起来像一个非常复杂的功能,你应该使用一个类!或者我可以这样做

class my_function(object):
   def __new__(self, input):
      #lots of complex code here that calls subfunc1 and subfunc2
      return output 
    @staticmethod 
    def subfunc1(blah):
        return blah1output
    @staticmethod 
    def subfunc2(blah):
        return blah2output

但是,这似乎是一个奇怪的用途,因为我并不真正关心创建和维护类的实例。

在这里使用类的一个主要优点是,您可以更轻松地测试subfunc1和subfunc2,仅此一点可能是使用它的充分理由。

然而,由于我还不熟悉编程,有人可能会为生产环境和/或通常最pythonic的解决方案提出最佳解决方案吗?

1 个答案:

答案 0 :(得分:2)

@ wwii的评论是正确答案。

详细说明,你的直觉是正确的,创建一个可以作为单例的类可能不是pythonic - 模块是执行此操作的首选方法(这里是programming faq中的斜向引用)

你也是正确的,能够测试你的子功能是好的。将它们从函数体中拉出来的另一个原因是因为Python作为一种解释语言,否则每次调用外部函数时都会重建子函数。

Benjamin Gleitzman光荣的howdoi module(链接到他的github回购)是一个很好的例子,说明如何将复杂的问题分解成小的,非常易读的部分 - 遵循PEP 8哲学“扁平比嵌套“好”,简单比复杂“

更好

修改

这是一个可以掩盖内部函数的简单模块(python tutorial on modules)的示例。结构是:

mymodule
|____
  |___  __init__.py
  |___  submodule.py
__init__.py中的

"""
This docstring shows up when someone does `help(mymodule)`.
"""
from submodule import my_function
submodule.py中的

def _subfunc1(x):
    """A preceding underscore signals to the reader that it's an internal function."""
    return x + 1

def _subfunc2(x):
    return x * 2

def my_function(x):
    """Yours will be cooler."""
    return _subfunc1(x) * _subfunc2(x)

使用它:

>>> import mymodule
>>> result = mymodule.my_function(5)
>>>
>>> # But internal functions (not imported) won't be visible...
>>> mymodule._subfunc1(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute '_subfunc1'