Как следует из названия, я пытаюсь написать собственный декодер для объекта, класс которого я определил, который содержит другие объекты, класс которых я определил. «Внешний» класс — это Edge, определенный следующим образом:
class Edge:
def __init__(self, actor, movie):
self.actor = actor
self.movie = movie
def __eq__(self, other):
if (self.movie == other.movie) & (self.actor == other.actor):
return True
else:
return False
def __str__(self):
print("Actor: ", self.actor, " Movie: ", self.movie)
def get_actor(self):
return self.actor
def get_movie(self):
return self.movie
с "внутренними" классами актера и фильма, определенными следующим образом:
class Movie:
def __init__(self, title, gross, soup, year):
self.title = title
self.gross = gross
self.soup = soup
self.year = year
def __eq__(self, other):
if self.title == other.title:
return True
else:
return False
def __repr__(self):
return self.title
def __str__(self):
return self.title
def get_gross(self):
return self.gross
def get_soup(self):
return self.soup
def get_title(self):
return self.title
def get_year(self):
return self.year
class Actor:
def __init__(self, name, age, soup):
self.name = name
self.age = age
self.soup = soup
def __eq__(self, other):
if self.name == other.name:
return True
else:
return False
def __repr__(self):
return self.name
def __str__(self):
return self.name
def get_age(self):
return self.age
def get_name(self):
return self.name
def get_soup(self):
return self.soup
(суп — это просто красивый объект супа для страницы Википедии этого фильма/актера, его можно игнорировать). Я также написал клиентский кодировщик для класса Edge:
class EdgeEncoder(json.JSONEncoder):
def default(self, o):
if isinstance(o, Edge):
return {
"Actor": {
"Name": o.get_actor().get_name(),
"Age": o.get_actor().get_age()
},
"Movie": {
"Title": o.get_movie().get_title(),
"Gross": o.get_movie().get_gross(),
"Year": o.get_movie().get_year()
}
}
return json.JSONEncoder.default(self, o)
который я тестировал, и он правильно сериализует список ребер в файл JSON. Теперь моя проблема возникает при попытке написать пограничный декодер. Я использовал страницу github здесь в качестве справки, но мой кодировщик отличается от его и моего. м интересно, нужно ли его менять. Нужно ли мне явно кодировать тип объекта как его собственную пару ключ-значение в его сериализации JSON, как это делает он, или есть какой-то способ получить ключи «Актер» и «Кино» с сериализацией края? Точно так же есть способ получить «Имя». «Возраст» и т. д., чтобы я мог реконструировать объект «Актер/Кино», а затем использовать их для реконструирования края? Есть ли лучший способ вместо этого кодировать мои объекты? Я также пробовал следовать этот учебник, но я обнаружил, что использование объектных диктов сбивает с толку их кодировщик, и я не был уверен, как расширить этот метод на пользовательский объект, который содержит пользовательские объекты.