#python #class #getter-setter
Вопрос:
class PersistenVars:
def __init__(self, filename):
self.filename = filename
with open(filename, 'r') as file:
# Saved variables as a list [start, end, index]
self.content = eval(file.read())
self.start = self.content[0]
self.end = self.content[1]
self.index = self.content[2]
Всякий раз , когда я обновляю значение self.start
, self.end
или self.index
я также хочу обновить файл и self.content
(с новыми значениями).
Сначала я попытался использовать декоратор свойств для каждого атрибута, но я просто пишу одно и то же снова и снова для чего-то, что выполняет ту же цель.
class PersistenVars:
def __init__(self, filename):
self.filename = filename
with open(filename, 'r') as file:
# Saved variables as a list
self.content = eval(file.read())
self._start = self.content[0]
self._end = self.content[1]
self._index = self.content[2]
@property
def start(self):
return self._start
@start.setter
def start(self, value):
self.content[0] = self._start = value
with open(self.filename, 'w') as file:
file.write(repr(self.content))
# And the same thing for the end, index
Каков самый питонический способ продолжать в том же духе?
Комментарии:
1. Будьте очень уверены, что никто другой не сможет отредактировать резервное хранилище, прежде
eval
чем включить его содержимое.2. По сути, вы пытаетесь заново
pickle
реализовать модуль с нуля.3. @чепнер, да, никто не должен быть в состоянии, спасибо за вашу заботу
4. @chepner Я слышал о модуле (хотя только название), но не знал, что он может это сделать, я проверю его
5. (На самом деле,
shelve
может быть, это было бы более уместно.pickle
сериализует значения;shelve
используетсяpickle
для реализации сопоставления, изменения которого могут быть автоматически записаны на диск при назначении.)