Python записывает свойства объекта в файл - PullRequest
1 голос
/ 22 марта 2019

Я решаю задачу моделирования n-body с помощью Python OOP.Каждая из моих частиц - это объект со свойствами, такими как масса, положение, скорость и т. Д., И я хотел бы, чтобы каждые несколько раз симуляция записывала свойства частицы в файл.Таким образом, каждая частица будет иметь файл, и каждая строка будет иметь свои свойства в определенное время.Например, мой класс будет выглядеть примерно так:

from numpy import mod

class Particle(object):
    def __init__(self):
        self.idx = 3        # particle id
        self.t = 0.7        # s
        self.mass = 20.     # kg
        self.x = 20.        # m
        self.y = 30.        # m
        self.dt2store = 0.7 # s (simulated time)

    def store(self):
        if mod(self.t, self.dt2store):
            self.writer()

    def writer(self):
        '''
        It stores data in particle id3 file
        data2store = [self.t, self.mass, self.x, self.y]
        '''

Какой самый лучший и эффективный способ сделать это?

Спасибо за помощь.

1 Ответ

1 голос
/ 22 марта 2019

В python есть библиотека под названием Pickle , которая позволяет сериализовать или десериализовать объекты.Это не очень эффективно по сравнению с другими библиотеками, такими как JSON, и вызывает некоторые проблемы с безопасностью (вы можете проверить это здесь ).Но он обеспечивает простой способ записи и загрузки объектов с помощью методов:

  • pickle.dump(obj, file, protocol=None, *, fix_imports=True)
  • pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict")

Другой альтернативой будетиспользуйте методы библиотеки JSON :

  • json.dump
  • json.load

Но в этом случае вы бычтобы преобразовать ваш объект в некоторый встроенный тип данных, который принимает библиотека JSON, например dict, list или tuple, и в случае, если вам понадобится объект при загрузке, вам придется его воссоздать.Как то так:

with open('particle1.json', 'w') as fp:
  json.dump({'idx': particle.idx, 't': particle.t }, fp)

particle = Particle()
with open('particle1.json', 'r') as fp:
  particle_properties = json.load(fp)
  particle.idx = particle_properties['idx']
  particle.t = particle_properties['t']

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...