0

スタックオーバーフローこんにちは!

ライブラリに含まれるすべての書籍のレポートをコンパイルするプログラムで単純なコマンドを実行しています。ライブラリには棚のリストが含まれており、各棚には書籍の辞書が含まれています。しかし、私の最善の努力にもかかわらず、私は常にすべての本を複製し、プログラムに本を置くように指示した棚ではなく、すべての棚に置いています。

オブジェクトの作成と編成に関するある種の基本的なルールを見逃していると思います。

犯人は book クラスの enshelf メソッドと unshelf メソッドだと思います。

時間をありがとう、ジェイク

以下のコード:

class book():   

    shelf_number = None

    def __init__(self, title, author):
        super(book, self).__init__()
        self.title = title
        self.author = author

    def enshelf(self, shelf_number):
        self.shelf_number = shelf_number
        SPL.shelves[self.shelf_number].books[hash(self)] = self

    def unshelf(self):  
        del SPL.shelves[self.shelf_number].books[hash(self)]
        return self

    def get_title(self):
        return self.title

    def get_author(self):
        return self.author

class shelf():

    books = {}

    def __init__(self):
        super(shelf, self).__init__()

    def get_books(self):
        temp_list = []

        for k in self.books.keys():
            temp_list.append(self.books[k].get_title())
        return temp_list

class library():

    shelves = []

    def __init__(self, name):
        super(library, self).__init__()
        self.name = name

    def make_shelf(self):
        temp = shelf()
        self.shelves.append(temp)

    def remove_shelf(shelf_number):
        del shelves[shelf_number]

    def report_all_books(self):

        temp_list = []

        for x in range(0,len(self.shelves)):
            temp_list.append(self.shelves[x].get_books())

        print(temp_list)

#---------------------------------------------------------------------------------------
#----------------------SEATTLE PUBLIC LIBARARY -----------------------------------------
#---------------------------------------------------------------------------------------

SPL = library("Seattle Public Library")                     

for x in range(0,3):
    SPL.make_shelf()

b1 = book("matterhorn","karl marlantes")
b2 = book("my life","bill clinton")
b3 = book("decision points","george bush")

b1.enshelf(0)
b2.enshelf(1)
b3.enshelf(2)

print(SPL.report_all_books())

b1.unshelf()
b2.unshelf()
b3.unshelf()

出力:

[['決定点', '私の人生', 'マッターホルン'], ['決定点', '私の人生', 'マッターホルン'], ['決定点', '私の人生', 'マッターホルン']] なし【0.1秒で終了】

.. [["決定点"]、["私の人生"]、["マッターホルン"]] の代わりに

4

1 に答える 1

2
  1. dict.pop()の代わりに使用しdelます。
  2. に追加self.books = {}shelfます__init__booksの外側で宣言しない__init__でください。そうすると、そのクラスのすべてのインスタンスが同じものを参照することになります。代わりに、これにより、各インスタンスに独自の辞書が作成されます。これは、本を同時に 2 つの棚に置くことはできないため、もちろん必要なことです。
  3. libraryと そのshelvesbookと そのについても同じことを行いますshelf_number
  4. libraryインスタンスを引数としてenshelfandに渡しますunshelfSPLオブジェクトのメソッド内から参照すると、Python は local がSPL定義されていないことを検出するため、local スコープの外にあるものを検索します。しかし、何かを割り当てSPLたり、他の種類の突然変異的なビジネスを行おうとすると、UnboundLocalError.
  5. ボーナス:
    • class book(object)class shelf(object)、およびclass library(object)。(問題は解決しませんが、とにかくそれを行う必要があります。)
    • キーを使用する前にハッシュする必要はありません。キーはハッシュされます (ハッシュ可能な場合はハッシュ可能ですが、ハッシュしている場合は可能です)。
    • super()何かから継承していない限り、呼び出す必要はありません。その場合、それを使用して親または兄弟にメソッド呼び出しを委譲できますが、そうしていません。
    • get_books()にすぎないものとして実装できますreturn [self.books[k].get_title() for k in self.books.iterkeys()]
    • 同様にreport_all_books(): return [shlf.get_books() for shlf in self.shelves]. インデックスを反復処理しているのではなく、要素自体を反復処理していることに注意してください。for c in "foobar": print(c)自分で確認したい場合は、対話型シェルを試してください。
于 2013-07-24T22:50:16.760 に答える