在 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)
在 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 的标准并具有一系列优势。
我有这个代码:
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)
在 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 的标准并具有一系列优势。