我编写了以下代码。当我尝试在文件末尾运行它时,得到以下堆栈跟踪:
AttributeError: 'super' object has no attribute do_something
class Parent:
def __init__(self):
pass
def do_something(self, some_parameter, next_parameter):
if type(some_parameter) is not int:
raise AttributeError("Some message")
if type(next_parameter) is not int:
raise AttributeError("Some message")
class Child(Parent):
def __init__(self):
super(Parent).__init__()
def do_something(self, some_parameter, next_parameter):
super(Parent).do_something(some_parameter, next_parameter)
return some_parameter + next_parameter
object = Child()
object.do_something(2, 2)
该如何解决?在这个简单的继承示例中,我在哪里出错了?
答案 0 :(得分:3)
您将错误的参数传递给super
。如果您要传递参数,则它们必须是 current 类和实例,而不是您希望调用的父类。或者假设您使用的是Python 3,则可以完全跳过参数,编译器将始终为您工作。允许使用一个参数调用super
,但它会返回一个几乎没有用的“未绑定超级对象”。
更改呼叫以使用以下样式之一:
class Child(Parent):
def __init__(self):
super().__init__() # no arguments is almost always best in Python 3
def do_something(self, some_parameter, next_parameter):
super(Child, self).do_something(some_parameter, next_parameter) # name the current class
return some_parameter + next_parameter
我还要注意,您在Parent.do_something
中进行类型检查非常尴尬。而不是type(some_parameter) is not int
,请使用isinstance(some_parameter, int)
(除非您有意排除子类型)。
答案 1 :(得分:1)
您在这里遇到一些问题。首先,父do_something
定义存在缩进错误。这意味着它被定义为一个函数本身,而不是一个Parent
类的方法。
第二,类方法通常应将self
作为其第一个参数,因为当调用它们时,它们所引用的对象将作为第一个变量传递。
第三,当您调用super()
时,无需指定超级对象,这是Child
的类定义中固有的。
下面是您的代码的固定版本,应可以按预期执行。
class Parent:
def __init__(self):
pass
def do_something(self, some_parameter, next_parameter):
if type(some_parameter) is not int:
raise AttributeError("Some message")
if type(next_parameter) is not int:
raise AttributeError("Some message")
class Child(Parent):
def __init__(self):
super(Parent).__init__()
def do_something(self, some_parameter, next_parameter):
super().do_something(some_parameter, next_parameter)
return some_parameter + next_parameter
test = Child()
test.do_something(2, 2)