【发布时间】:2020-05-02 00:55:36
【问题描述】:
我一直在进行一组非常密集的计算。这一切都是为了支持我遇到的特定问题。
但问题的性质与此没有什么不同。假设我开发了一个名为“Matrix”的类,它具有实现矩阵的机制。实例化可能会采用列表列表,这将是矩阵条目。
现在我想提供一个乘法方法。我有两个选择。首先,我可以像这样定义一个方法:
class Matrix():
def __init__(self, entries)
# do the obvious here
return
def determinant(self):
# again, do the obvious here
return result_of_calcs
def multiply(self, b):
# again do the obvious here
return
如果我这样做,两个矩阵对象 a 和 b 的调用签名是
a.multiply(b)...
另一个选择是@staticmethod。然后,定义如下:
@staticethod
def multiply(a,b):
# do the obvious thing.
现在调用签名是:
z = multiply(a,b)
我不清楚什么时候一个比另一个好。独立函数并不是真正的类定义的一部分,但谁在乎呢?它完成了工作,并且因为 Python 允许从外部“进入对象”引用,它似乎可以做任何事情。在实践中,它们(类和方法)最终会出现在同一个模块中,因此它们至少在那里链接。
另一方面,我对@staticmethod 方法的理解是,该函数现在是类定义的一部分(它定义了其中一个方法),但是该方法没有传入“self”。在某种程度上,这很好,因为调用签名更好看:
z = multiply(a,b)
并且该函数可以访问所有实例的方法和属性。
这是查看它的正确方法吗?是否有充分的理由去做其中之一?它们在哪些方面不等效?
【问题讨论】: