【问题标题】:Class methods when overloading addition operator in Python在 Python 中重载加法运算符时的类方法
【发布时间】:2015-03-02 02:09:28
【问题描述】:

在 Python 中,当您重载加法运算符时,我正在寻找处理方法的最佳方式。

在下面的示例中,我试图弄清楚我应该在 Function 类的 add 方法中添加什么。

class Function(object):

    def calculate(self, x):
        raise NotImplementedError()

    def __add__(self, other):
        res = Function()
        res.calculate = lambda x: self.calculate(x) + other.calculate(x)
        return res

class Square(Function):

    def calculate(self, x):
        return x**2

class Cube(Function):

    def calculate(self, x):
        return x**3

在示例中,如果我想计算 2^2 + 2^3,我会这样做

f = Square() + Cube()
print f.calculate(2)

我这样做的方法似乎并不明显,所以我猜有更好的方法。不确定它是否有帮助,但在我真正的问题中,我正在使用(统计)内核。我必须处理多种方法,而且我还需要重载乘法运算符。

【问题讨论】:

  • 不是你问的,但你可能会觉得sympy很有趣
  • 问这个问题已经有一段时间了,所以我想试一试。但我不明白你为什么要这样做,并且没有一个具有属性的类函数,即code="x**2+y**2+x",你可以在你需要的坐标中eval?像这样,你实际上需要定义你能想到的每一个可能的函数,并且在这个例子中它们并没有真正代表它们的规范形式(即实际的平方函数是a*x**2+b*x+c。你能描述一下你到底想要什么吗?做什么?

标签: python operator-overloading


【解决方案1】:

为了更好的方法,看看numpy.poly1d(),它被实现为一个函数而不是一个类。这样的东西可能适合您的需求:

def poly(*coeffs):
    def _poly(x,coeffs=coeffs):
        return sum(c*x**i for i,c in enumerate(coeffs))
    return _poly

那么你可以这样使用它:

fn = poly(4,5,6)
ret = fn(7)
assert(ret == 333)

在这个例子中,我计算了:

4 + 5 * 7 + 6 * 7**2

【讨论】:

  • 谢谢。我并不是真的想添加多项式——我想从一些统计内核中添加相似性度量和梯度。多项式是一个简单的例子。
  • 但我认为该示例对于您想做的事情仍然有效。基本上是一个创建另一个函数的函数。
猜你喜欢
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2012-06-02
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
相关资源
最近更新 更多