Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

Python Basic Object-Oriented Python Emulating Built-ins Emulating Built-ins

Benjamin Cha
Benjamin Cha
3,287 Points

NameError: name "Book" is not defined

class Book: def init(self, author, title): self.author = author self.title = title

def __str__(self):
    return f"{self.author}, {self.title}"
    personal = Book("John Green", "Paper Towns")

def __eq__(self, other):
    if isinstance(other, Book):
        return self.author == other.author and self.title == other.title
    return False

The error NameError: name "Book" is not defined keeps persisting in my code. I am stuck on the 2nd challenge out of 3. Can somebody please give me an answer as soon as possible?

Ben

book.py
class Book:
    def __init__(self, author, title):
        self.author = author
        self.title = title

    def __str__(self):
        return f"{self.author}, {self.title}"
        personal = Book("John Green", "Paper Towns")

    def __eq__(self, other):
        if isinstance(other, Book):
            return self.author == other.author and self.title == other.title
        return False
bookcase.py
from book import Book


class BookCase:
    def __init__(self):
       self.books = []

    def add_books(self, book):
        self.books.append(book)

1 Answer

Rohald van Merode
seal-mask
STAFF
.a{fill-rule:evenodd;}techdegree
Rohald van Merode
Treehouse Staff

Hey Benjamin Cha 👋

When the __eq__ method tries to execute isinstance(other, Book), it's attempting to reference the Book class, but since you're still in the middle of defining the class, Book is not yet fully defined, causing this NameError.

To fix this you can remove the isinstance call and simply return the conditional:

class Book:
    def __init__(self, author, title):
        self.author = author
        self.title = title

    def __str__(self):
        return f'{self.author}, {self.title}'

    def __eq__(self, other):
        return self.author == other.author and self.title == other.title
Benjamin Cha
Benjamin Cha
3,287 Points

Thank you for helping me! I cleared the challenge! :)