Попытка сохранить класс (в списке) в файл - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь создать программу, в которой я могу хранить NPC в игре с определенными атрибутами. Такие как: фракция, личность, интересы / хобби. Чтобы добиться этого, я создал класс NPC.

class NPC: #name, faction, position/job, character, interests, other
    def __init__ (self, name, faction, pos, char, inter, misc):
        self.name = name
        self.faction = faction
        self.pos = pos
        self.char = char
        self.inter = inter
        self.misc = misc

Я создал различные функции для этой программы, такие как создание новых, изменение определенных атрибутов у NPC, их удаление, печать и сортировка. Чтобы сохранить неигровых персонажей, я добавляю их в список под названием «NPClist». Я хотел бы знать, как сохранить этот список в текстовом файле или что-то. До сих пор я пробовал модуль рассола, но это не похоже на работу. (Источник: Как сохранить список в файл и прочитать его как тип списка? )

with open("NPCs.text", "wb") as file:
    pickle.dump(NPClist, file)

with open("NPCs.text", "rb") as file:
    NPClist.append(pickle.load(file))

Я поместил нижнюю в верхнюю часть программы, чтобы она загружалась при запуске программы, а верхнюю - в верхней части цикла, чтобы она часто сохранялась. Когда я пытаюсь запустить программу, я получаю сообщение об ошибке.

AttributeError: Can't get attribute 'NPC' on <module '__main__' (built-in)>

Есть ли другой способ решить эту проблему, или я просто делаю маринованные огурцы?

Ответы [ 3 ]

2 голосов
/ 09 апреля 2019

Если вам нужны только атрибуты, я бы предложил просто сохранить атрибуты, а не пытаться сохранить весь объект, и упростить этот процесс с помощью некоторых вспомогательных методов в NPC.

Например:

class NPC:

    def dump(self):
        return [self.name, self.faction, self.pos, self.char, self.inter, self.misc]

    @staticmethod
    def build_npc(attributes):
        return NPC(*attributes)

И тогда вы можете иметь дело со сбросом следующим образом:

NPClist = [NPC(...), NPC(...) ... ]

with open("NPCs.text", "wb") as file:
    pickle.dump([i.dump() for i in NPClist], file)

И загрузкой так:

with open("NPCs.text", "rb") as file:
    NPClist = [NPC.build_npc(attributes) for attributes in pickle.load(file)]
1 голос
/ 09 апреля 2019
class NPC: #name, faction, position/job, character, interests, other
    def __init__ (self, name, faction, pos, char, inter, misc):
        self.name = name
        self.faction = faction
        self.pos = pos
        self.char = char
        self.inter = inter
        self.misc = misc

NPCList = []

handsome_npc = NPC(name='n1c9', faction='Good People', pos='Developer',
                   char='', inter='', misc='')

# create other NPCs as needed

NPCList.append(handsome_npc)

with open('NPCS.text', 'w') as f:
    f.write('name,faction,pos\n')
    # add other attrs as wanted
    for npc in NPCList:
        f.write(f"{npc.name}, {npc.faction}, {npc.pos}")
        # add other attrs as wanted
        f.write('\n')

Пытался написать что-то, что было бы доступно новичку - возможно, из-за этого было бы немного многословно. Ответ Марка Тайлера тоже очень хороший!

re: comment - впоследствии вы можете получить доступ к файлу следующим образом:

class NPC: #name, faction, position/job, character, interests, other
    def __init__ (self, name, faction, pos, char, inter, misc):
        self.name = name
        self.faction = faction
        self.pos = pos
        self.char = char
        self.inter = inter
        self.misc = misc

npclist_built_from_file = []
with open('NPCS.text', 'r') as f:
    NPCS_lines = f.readlines()
    for line in NPCS_lines[1:]: # skip the header line
        npc = NPC(name=line[0], faction=line[1], pos=line[2], char='', inter='', misc='')
        # I used empty strings for char/inter/misc because they were empty in the original
        # example, but you would just fill out line[3], line[4], line[5] for the rest if wanted.
        npclist_built_from_file.append(npc)

Тогда вы можете делать все что угодно с объектами NPC в списке npclist_built_from_file

0 голосов
/ 09 апреля 2019
import ast

def stringifyNPC(c):
  return str(c.__dict__)

def unStringifyNPC(s):
  n = NPC(None,None,None,None,None,None)
  n.__dict__ = ast.literal_eval(s)
  return n
...