0

課題として、私は 2 つのクラスを作成しようとしています。1 つのクラス はBook、本がチェックアウトされているかどうかを確認し、本のタイトル、著者、およびページ番号 (これらは入力変数です) を返します。Library、タイトルと著者のペアを辞書に追加し、特定の本がチェックアウトされているかどうかを確認します。実行しようとするたびにエラーメッセージが表示されます。この奇妙なエラーを修正するにはどうすればよいですか?

これが私のコードです:

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

    def checked_Out(self):
        print(self.checkedOut)
        return self.checkedOut

    def change_value_of_checkedOut(self):
        if self.checkedOut == False:
            self.checkedOut = True
            print("Switched from False to True.")
        elif self.checkedOut == True:
            self.checkedOut = False
            print("Switched from True to False.")

    def return_pages(self):
        print(self.pages)
        return self.pages

    def return_title(self):
        print(self.title)
        return self.title

class Library:
    def __init__(self):
        collection = {}

    def addExistingBook(self, book):
        collection[book.title] = book.author

    def addNewBook(self, title, author, pages):
        new_book = Book(title, author, pages)
        collection[title] = new_book.author

    def change_checked_out_status(self, title):
        if title in collection.keys():
            title.change_value_of_checkedOut()
        else:
            print("This book is not in the collection.")

def main():
    title = str(input("Enter the title of the book. "))
    author = str(input("Enter the author of the book. "))
    pages = int(input("Enter the number of pages in the book. "))
    myBook = Book(title, author, pages)
    myLib = Library()
    myLib.addExistingBook(myBook)

main()

実行しようとすると、次のようになります。

Enter the title of the book. The Count of Monte Cristo
Enter the author of the book. Alexandre Dumas
Enter the number of pages in the book. 1250
Traceback (most recent call last):
  File "C:/Python33/Class Programs/book_library_classes.py", line 56, in <module>
    main()
  File "C:/Python33/Class Programs/book_library_classes.py", line 54, in main
    myLib.addExistingBook(myBook)
  File "C:/Python33/Class Programs/book_library_classes.py", line 36, in addExistingBook
    collection[book.title] = book.author
NameError: global name 'collection' is not defined
4

6 に答える 6

2

You defined collection as a local variable in __init__:

def __init__(self):
    collection = {}

But that doesn't magically make it an instance variable. You have to do that explicitly:

class Library:
    def __init__(self):
        self.collection = {}

    def addExistingBook(self, book):
        self.collection[book.title] = book.author

Also, I wouldn't make methods like this:

def return_title(self):
    print(self.title)
    return self.title

They're just another layer of obfuscation over the straightforward book.title attribute.

Also, you don't need to write .keys(). if key in dictionary is the preferred syntax:

if title in self.collection:
于 2013-04-24T04:50:28.613 に答える
1

コレクションを参照している場所に追加self.collectionします。

于 2013-04-24T04:50:35.990 に答える
1

クラス メンバーには、 を使用してアクセスする必要がありますself.propertyName。コードは次のようになります。

class Library:
    def __init__(self):
        self.collection = {}

    def addExistingBook(self, book):
        self.collection[book.title] = book.author

     ....
于 2013-04-24T04:50:56.360 に答える
0

collectionLibrary インスタンスに属するpython を指定する必要がありmyLibます。

ライブラリ クラスを次のように変更し ますself.collectioncollection

class Library:
    def __init__(self):
        self.collection = {}

    def addExistingBook(self, book):
        self.collection[book.title] = book.author

    def addNewBook(self, title, author, pages):
        new_book = Book(title, author, pages)
        self.collection[title] = new_book.author

    def change_checked_out_status(self, title):
        if title in self.collection.keys():
            title.change_value_of_checkedOut()
        else:
            print("This book is not in the collection.")

お役に立てれば!

于 2013-04-24T04:55:18.283 に答える
0

Collectionクラスでは internal を使用する必要がありますcollection:

class Library:
    def __init__(self):
        self.collection = {}

    def addExistingBook(self, book):
        self.collection[book.title] = book.author

また、最後の行は疑わしく見えます。これを意味しましたか:

self.collection[book.title] = book
于 2013-04-24T04:51:04.537 に答える
0

コレクションはローカル変数です

関数内で self.collection を使用して参照してみてください。これで問題が解決するはずです。

于 2013-04-24T04:52:20.500 に答える