修改类层次结构中的方法

艾迪Y

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

这是这个 Polynomial add并返回一个 Polynomial 对象

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 呢?

长城

在我看来,您试图从超类的方法返回子类的实例很奇怪,因为超类通常意味着更一般的概念。

我认为您可以使用传入的适当参数调用 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”的关键字,它可以让你不通过它的名称直接调用超类的方法,但有很多细节关于关键字,所以你可能想自己研究文档。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章