在 python 中使用 super().Sub(n1,n2) 出错

Error by using super().Sub(n1,n2) in python

我有这个代码:

class Operation:
    def Sum(self,n1,n2):
        SumResult=n1+n2
        print("Sum=",SumResult)
    def Sub(self,n1,n2):
        SubResult=n1-n2
        print("Sub=",SubResult)

class OperationWithMul(Operation):
    def Mul(self,n1,n2):
        MulResult=n1*n2
        print("Mul=",MulResult)
    def Sub(self,n1,n2):
        super().Sub(n1,n2)

def main():
    OpMul=OperationWithMul();
    OpMul.Sub(4,2)
    OpMul.Sum(10,15)
    OpMul.Mul(10,2)

if __name__ == '__main__':
    main()

但是当我 运行 它时,我得到了一个错误:

> Traceback (most recent call last):   File
> "C:/path/OOPOverride.py", line
> 32, in <module>
>     if __name__ == '__main__':main()   File "C:/path/OOPOverride.py", line
> 24, in main
>     OpMul.Sub(4,2)   File "C:/path/OOPOverride.py", line
> 14, in Sub
>     super(Operation).Sub(n1,n2) TypeError: must be type, not classobj

当我将鼠标放在 super() 函数上时,它告诉我

> Python version 2.7 does not support this syntax. super() should have
> arguments in Python

那么在这里使用 super() 的正确语法是什么?

在Python2.7中,必须这样写:

super(OperationWithMul, self).Sub(n1,n2)

详情请参考super()'s Python 2.7 documentation

在 Python 2 中使用 super,你必须使用新式 classes:

class Operation(object):  # makes the base-class a new-style class
    # your code

class OperationWithMul(Operation):
    # your code

# ...

并且您必须将当前 class 和实例显式传递给 super:

super(OperationWithMul, self).Sub(n1, n2)

在 Python 3 中,您不会遇到这些问题,因为所有 classes 都是新式的并且 super 推断出所需的参数。尽管它可能超出了问题的范围,但你真的应该考虑切换到 Python 3.

此外,Python 中的方法名称通常以小写字母开头。这不是硬性规定,但它 可以 让其他 Python 程序员(比如我自己)更容易理解您的代码。

这个问题好像和this one差不多。在 Python 2.7 中,对 super 的函数调用需要以下参数:

super(OperationWithMul,self).Sub(n1,n2)

而你的根class需要继承对象class:

class Operation(object):

在这样做时,您将 class 定义为新样式 class,这是 Python 3.0 的标准并具有一系列优势。