Многие объекты в Python имеют repr()
, что соответствует коду Python, который использовался для его создания.Поэтому сначала измените строку, чтобы использовать repr
вместо str
.(Хотя для некоторых объектов метод __str__
просто вызывает __repr__
.)
datafile.write(repr(h1))
Вы можете использовать repr, подобный этому, чтобы восстановить объект, используя eval()
на нем.Это не так надежно, как использование pickle, потому что некоторые повторы не являются допустимым кодом Python.
with open('handtest.txt') as datafile:
h1 = eval(datafile.read())
Обратите внимание, что это угроза безопасности.Не читайте и eval()
содержимое файлов, которым вы не доверяете, поскольку вредоносный код Python может привести к плохим вещам, таким как удаление всех ваших файлов.
Конечно, это работает, только если repr является допустимым Pythonкод.Возможно, вам придется написать правильный __repr__
метод для вашего класса рук.Кроме того, иногда это требует соответствующей работы по импорту.Например, если вы eval
вводите строку 'Hand(3)'
, вы должны были импортировать Hand
, чтобы это работало.
Оценка repr работает только в том случае, если все состояние объекта может бытьустановить в одном выражении.В настоящее время ваш класс не предназначен для этого, потому что он рандомизирует вещи в __init__
.Поэтому правильное выражение repr, хотя и возможно, было бы довольно неловко.
Это не должно вас останавливать.Вы можете создать альтернативные инициализаторы в Python, используя @classmethod
.Сделайте тот, который может создать экземпляр и установить все его состояние.Может быть, что-то вроде
@classmethod
def of(cls, hand, bj):
hand = super().__new__(cls)
hand.list = hand
hand.listBj = bj
return hand
Тогда вы могли бы создать хороший repr с точки зрения этого.
def __repr__(self):
return f"Hand.of(hand={self.list!r}, bj={self.listBj!r})
Если есть еще состояние, которое вы хотите сохранить, добавьте его в качестве еще одного аргумента для метода класса.и покажите это в отчете.