Есть библиотека книг (класс BookLibrary), у библиотеки может быть много полок (класс BookShelf), у каждой полки много книг (класс Book).
Полка книг наследуется от базового класса который не включается в себя список книг, специально для того чтобы книга могла ссылаться на полку, на которой находится.
Книга содержит в себе ссылку на полку, на которой стоит эта книга, но эта ссылка не содержит список книг.
import jsons
from types import SimpleNamespace
from dataclasses import dataclass
from typing import List
@dataclass
class BookShelfRef:
name: str
def __init__(self, name):
self.name = name
@dataclass
class BookShelf(BookShelfRef):
books: List # list of Book
def __init__(self, name):
super().__init__(name)
self.books = list()
@dataclass
class Book:
name: str
shelf: BookShelfRef
def __init__(self, name):
self.name = name
@dataclass
class BookLibrary:
name: str
shelfes: List[BookShelf]
def __init__(self, name):
self.name = name
self.shelfes = list()
def run():
lib = BookLibrary(name = 'Books library')
shelf = BookShelf(name = 'python')
book = Book(name = 'Alice in wonderlands')
book.shelf = super(BookShelfRef,shelf) # cast to base class instead
shelf.books.append(book)
lib.shelfes.append(shelf)
print('JSON:\n'+jsons.dumps(lib))
if __name__ == '__main__':
try:
run()
except SystemExit:
pass
Почитал гайды, пишут что правильно так: super(базовый класс который хочется получить, экземпляр дочернего)
увы не работает что-то..
Возвращает пустой shelf у книги...:
{
"name": "Books library",
"shelfes": [{
"books": [{
"name": "Alice in wonderlands",
"shelf": {}
}
],
"name": "python"
}
]
}