1
import cPickle

class player:
    level = 1
    exp = 0
    inven = []

char = player()

#Append items to char.inven later in program

def save():
    file = open('savegame.dat', 'w')
    cPickle.dump(char, file)

def load():
    s_g = open('savegame.dat', 'r')
    char = cPickle.load(s_g)
    s_g.close()

これは実際のコードのごく一部です。どこが間違っているかを示すために切り詰めました。

保存/ロードすると、リストをファイルに具体的にダンプしても、char.invenにアイテムが保持されません。リストのアイテムを消去する理由はありますか?

また、ダンプする前にリストに参加すると、リストが保存されます。ただし、一部のリスト項目は2語であるため、list.split()を使用すると以前とは異なります。

4

1 に答える 1

3

invenインスタンスではなく、クラスの属性です。Pickleはクラスについて何も保存しません。後でそれを再インスタンス化するために、クラスの名前を格納するだけです。invenとにかくクラス属性になりたくないと思うので、次のことを行う必要があります。

class player:
    def __init__(self):
        self.level = 1
        self.exp = 0
        self.inven = []

編集:それlevelが保存されているのを見ている場合、それはおそらくあなたがそれを再バインドしているためです。たとえば、これを行うコードがある場合:

self.level += 1

クラス属性をインクリメントしていません。新しいインスタンス属性を作成しています。objインスタンスがあり、それを行うときはいつでもobj,attr = ...、クラス属性ではなくインスタンス属性を作成します。

invenで同じ効果が見られない理由は、おそらくそれをself.inven.append(...)再バインドするのではなく、(たとえば、で)変更しているためです。したがって、インスタンス属性を作成することはなく、クラス属性を変更し続けるだけです。

これがPythonでどのように機能するかを理解するには、StackOverflowでクラス属性とインスタンス属性(クラス変数およびインスタンス変数とも呼ばれる)に関する質問を検索する必要があります。

于 2012-07-06T06:00:17.503 に答える