有时在编写python软件时,我会遇到这样一种情况:我不确定是使用带有子函数的函数,还是只使用一个类。在这些情况下,我有一系列不同的输入,我想对它们应用一些转换,然后生成一个不同的输出。我不太关心从输入到输出过程中产生的任何变量。它应该是一个函数,而不是一个简单的类。但在这些情况下,所涉及的操作也相当复杂,通常需要的子功能仅在将输入转换为输出的过程中有用,而不是更一般的意义上。在
一天下来,我通常只想用:
output = my_function(input)
所以我可以做一些类似的事情
^{pr2}$但是同事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
,而仅此一点就足以成为使用它们的理由。在
但是,由于我对编程还不熟悉,有人能为生产环境和/或通常是最具python风格的解决方案提出建议吗?在
@二战的评论是正确的答案。在
为了详细说明,您的直觉是正确的,即创建一个将作为单例函数的类可能不是python类型的-模块是实现这一点的首选方法(这里是programming faq中的一个间接引用)。在
您也正确地认为能够测试您的子功能是很好的。将它们从函数体中拉出的另一个原因是,Python作为一种解释语言,在每次调用外部函数时都会在内部重新构建子函数。在
Benjamin Gleizman辉煌的howdoi module(链接到他的github repo)是一个很好的例子,说明了如何按照PEP 8哲学将复杂的问题分解成小的、非常可读的部分,即“扁平比嵌套好”和“简单比复杂好”
编辑
下面是一个简单模块(python tutorial on modules)的示例,它可以屏蔽内部函数。结构是:
在
^{pr2}$__init__.py
中:在
^{3}$submodule.py
中:使用它:
相关问题 更多 >
编程相关推荐