2015-02-23 91 views
0

OK所以我創建了兩個名爲Note和Notebook的類。AttributeError:元組對象沒有屬性read_note()

class Note: 
    """ A Note """ 

    note_number = 1 

    def __init__(self, memo="", id=""): 
     """ initial attributes of the note""" 
     self.memo = memo 
     self.id = Note.note_number 
     Note.note_number += 1 

    def read_note(self): 
     print(self.memo) 


class NoteBook: 
    """The Notebook""" 

    def __init__(self): 
     self.note_book = [] 

    def add_notes(self, *args): 
     for note in enumerate(args): 
      self.note_book.append(note) 

    def show_notes(self): 
     for note in self.note_book: 
      note.read_note() 


n1 = Note("First note") 
n2 = Note("Second note") 
n3 = Note("Third note") 

notebook1 = NoteBook() 
notebook1.add_notes(n1, n2, n3) 
notebook1.show_notes() 

Traceback (most recent call last): 
    File "C:/Users/Alan/Python3/Random stuff/notebook revisions.py", line 47, in <module> 
    notebook1.show_notes() 
    File "C:/Users/Alan/Python3/Random stuff/notebook revisions.py", line 38, in show_notes 
    note.read_note() 
AttributeError: 'tuple' object has no attribute 'read_note' 

我怎麼得到屬性錯誤?我想讓我的show_notes()方法讀取notebook1列表中的所有註釋。

另外,如果我打印下面的語句我的結果是晦澀的消息:

print(notebook1.note_book[0]) 


(0, <__main__.Note object at 0x00863F30>) 

我將如何解決這個問題不會產生怪異神祕的消息,並打印字符串「首先說明」,「第二注意「和」第三注「。第一季度銷售價格指數:

+0

閱讀並應用https://stackoverflow.com/help/mcve。刪除絨毛​​(.str方法)幷包含基本的.add_note方法。然後包含錯誤消息。 – 2015-02-24 00:18:46

+0

感謝特里我編輯了這篇文章,希望現在更清楚。 – firebird92 2015-02-24 15:42:09

+0

複製,粘貼和運行後,我得到相同的錯誤。現在我可以回答問題。 – 2015-02-24 23:12:30

回答

0

Q1。爲什麼是例外?正如我所懷疑的那樣,這個異常是由.add_notes中的一個錯誤引起的。 enumerate(args)將筆記轉換爲包含序列號和筆記的元組。這是錯誤的,因爲筆記本電腦應該包含筆記,不是元組,因爲筆記已經有一個序列號,因爲每次調用add_note,因此,枚舉,在0更改add_note重新開始

def add_notes(self, *args): 
     self.note_book.extend(args) 

notebook1.show_notes()產生什麼你似乎想要。第二季度銷售價格下降,銷售價格下降,第二季度銷售價格下降,第二季度銷售價格下降。更好的代表性對於print(notebook1.note_book[0])打印元組不管元組內容如何都是錯誤的。對於測試,該行應該是最後一行之前的原始腳本的一部分。

打印元組打印每個元素的repr(),所以自定義__str__將被忽略。隨着add_noted更正,它現在只打印註釋的表示。

<__main__.Note object at 0x00863F30> 

若要提高,加回__str__方法,我問你刪除,或它們的版本。不過,我建議你改名爲__repr__

def __repr__(self): 
    """ gives string of initial atrributes""" 
    return "Memo: {0}\nNote number: {1}\n ".format(self.memo, self.id) 
# Note 1: First note 

如果只定義__str__,然後__repr__仍是大多無用默認值(如上)。如果您定義了__repr__,那麼自定義函數將用於repr()和str(),這與定義後者後添加行__str__ = __repr__的行相同。

+0

謝謝你,這是一個非常徹底的答案! – firebird92 2015-02-26 10:52:49

相關問題