修改类层次结构中的方法

时间:2017-04-26 15:11:13

标签: python

所以我有一个Polynomial超类和一个Quadratic子类,我想修改 add 运算符,所以它不返回一个多项式对象,而是返回一个Quadratic对象,我该怎么做呢?

这是多项式添加,它返回一个多项式对象

def __add__(self, other):
        newPoly = Polynomial()
        for i in range(len(self.coeffs)):
            newPoly.addterm(self.coeffs[i][0], self.coeffs[i][1])
            newPoly.addterm(other.coeffs[i][0], other.coeffs[i][1])
        return (newPoly)

这是二次类:

class Quadratic(Polynomial):
    def __init__(self, quad, lin, con):
        Polynomial.__init__(self, (quad, 2), (lin, 1), (con, 0))

那么如何修改 add 运算符以使其返回Quadratic对象而不是Polynomial?

1 个答案:

答案 0 :(得分:0)

我觉得你试图从超类的方法返回一个子类的实例,因为超类通常意味着更一般的概念。

我认为你可以用传入的适当参数调用Quadratic的构造函数。

def __add__(self, other):
        newQuad = Quad(0,0,0)
        for order,(c1,c2) in enumerate(zip(self.coeffs,other.other)):
            newQuad.addterm(c1[0], c1[1])
            newQuad.addterm(c2[0], c2[1])
            if order == 1:
                break

        return (newQuad)

我已经用更易读的Pythonic方式修改了你的代码。

老实说,我认为没有必要为每个订单派生一个子类,你可以通过附加属性来简单记录订单信息。

最后,不建议在子类的代码中显式写入超类的名称,因为它会降低灵活性.Python有一个名为“super”的关键字,它可以让你调用超类的方法而不直接通过它的名字,但是有一个关于关键字的很多细节,所以你可能想要自己研究文档。