python:无状态函数库设计

标签 python python-3.x

我正在构建一个包含各种函数的库,这些函数将经常在项目中重复使用。每个函数都是无状态的(创建时不需要参数,也没有任何内存)。一些功能使用其他功能。

这些函数将作为项目其余部分的参数传递。

以下哪种方法更好?

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 的原因是我的一些功能有一些共同点。例如,函数 f2f3f11 都是从调用 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/

相关文章:

python - 使用 C++ 扩展 Python 时,将模块方法放入不同的源文件失败

python - 将 RandomForestClassifier Predict_Proba 结果添加到原始 Dataframe

opencv - Python 3 是否支持 OpenCV?

python - 有没有内置的方法可以在 Python 中使用内联 C 代码?

python - 如何识别基因组中特定位置的特征

python - Django:使用 HttpResponseRedirect 将查询集传递到另一个 View

python-3.x - 如何在 Ubuntu 中访问 Python 包的脚本?

python - 如何将这两个类装饰器与 functools.update_wrapper 一起使用?

python - 如何创建具有可调参数的 numba 可调用对象?

Python 虚拟环境 (venv) 用户包