簡體   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