从良好的代码设计角度来看,算法和数据对象应该如何交互?

2024-04-24 11:30:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python为我的数据创建了一些数据对象。现在,我需要写一些算法来处理这些数据。我正在讨论将算法写成:

(1)数据对象的方法。 (2) 单独模块中的功能。 (3) 算法对象。你知道吗

我注意到在numpy中,一些算法(如min、max、sum等)被实现为numpy array对象的方法,而其他更复杂的算法(如svd)则被实现为函数(在一个称为numpy.linalg公司). 我还注意到,有些人将算法实现为对象,这些对象作用于数据对象(在前面的例子中,linalg很可能是一个具有称为svd的方法的类)。你知道吗

我有一个例子来说明我的问题。假设我的数据对象名为sample,我的算法名为rasam。你知道吗

我可以实现rasam作为我的sample对象的一种方法,并作为

this_sample = sample()
this_sample.rasam(rasam_args)

或者

this_sample = sample()
rasam(this_sample,rasam_args)

或者

this_sample = sample()
this_rasam  = rasam(rasam_args)
this_rasam.run(this_sample)

以上哪一个选项会被认为是代码良好的设计? 接下来,为什么SVD算法实现为函数,而As SUM实现为numpy数组对象的方法?你知道吗

我发现这个链接是从“函数vs方法”的一般观点来解决这个问题的,但我更感兴趣的是数据对象的特定上下文和作用于数据的算法。你知道吗

In Python, when should I use a function instead of a method?


Tags: 模块数据sample对象方法函数功能numpy
1条回答
网友
1楼 · 发布于 2024-04-24 11:30:33

这类问题没有真正正确的答案,答案总是“视情况而定”。就我个人而言,我会选择选项1或2。如果不确切地知道您的数据是什么,很难说清楚,但基本上您要考虑的主要问题是代码重用。你知道吗

数据对象之间的形式有多不同?你的算法是一个一刀切的解决方案吗?如果是这样,那么您可能希望使它们在一个单独的模块中运行。你知道吗

Numpy实际上遵循选项1和2(据我所知)。虽然numpy array对象有一个sum函数,但是还有一个顶级的numpy.sum函数,它在其他numpy数据结构(如矩阵)的轴上运行。你知道吗

我不是一个numpy开发人员,但是我猜他们给numpy数组提供它自己的sum实现的原因仅仅是为最终用户创建一个更好的api。你知道吗

也就是说,我认为在一个单独的模块中创建算法作为它们自己的函数是不会出错的。如果您有一个数据结构确实需要它自己实现相同的算法,那么您可以将该方法添加到该数据结构的类中。你知道吗

相关问题 更多 >