繁体   English   中英

AttributeError:“超级”对象没有属性

[英]AttributeError: 'super' object has no attribute

我写了下面的代码。 当我尝试在文件末尾运行它时,得到以下堆栈跟踪:

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)

我应该如何解决呢?在这个简单的继承示例中,我在哪里犯了错误?

您将错误的论点传递给super 如果您要传递参数,则它们必须是当前类和实例,而不是您希望调用的父类。 或者假设您使用的是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) (除非您有意排除子类型)。

您在这里有几个问题。 首先,父do_something定义存在缩进错误。 这意味着它被定义为本身的函数,而不是Parent类的方法。

其次,类方法通常应将self作为其第一个参数,因为当调用它们时,它们所引用的对象将作为第一个变量传递。

第三,当您调用super()时,无需指定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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM