我正在构建一个包含各种函数的库,这些函数将经常在项目中重复使用。每个函数都是无状态的(创建时不需要参数,也没有任何内存)。一些功能使用其他功能。
这些函数将作为项目其余部分的参数传递。
以下哪种方法更好?
1.将所有函数定义为某个模块中的全局函数:
def f1(x):
# use x
def f2(x):
# use x and f1
2.将所有函数定义为类中的方法,并根据用途对类进行层级安排:
class F1:
def __call__(x):
# use x
f1 = F1()
class F2(F1):
def __call__(x):
# use x and f1
f2 = F2()
我什至考虑选项 2 的原因是我的一些功能有一些共同点。例如,函数 f2
、f3
、f11
都是从调用 f1
开始的。我在想我可能想做这样的事情:
class F1:
def __call__(self, x):
self.f1(x)
self.calc(x)
def f1(self, x):
# do something
# don't define calc here; F1 is abstract base class
class F2(F1):
def calc(self, x):
# do something
class F3(F1):
def calc(self, x):
# do something
最佳答案
选项 1 简单很多。选项 2 不必要地复杂!!
另一个可能使测试更容易的建议:
1.1。将它们全部定义为一个模块中单个类的方法。适当使用@staticmethod 和@classmethod 装饰器。通过稍后提供新类或子类,这可以使它们更容易替换为模拟或替换为替代实现。
垃圾邮件.py:
class Spam(object):
@staticmethod
def f1(x):
# use x
@classmethod
def f2(cls, x):
# use x and cls.f1
这仍然比较复杂,因此您可能只想坚持使用选项 1,直到您需要上述内容。
关于python:无状态函数库设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959352/