@AlexanderMi
Software Developer

Как получить экземпляр родителя из дочернего класса?

Есть библиотека книг (класс 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"
        }
    ]
}
  • Вопрос задан
  • 135 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
Не надо так делать. Просто не надо.

Лучше подумай в другую сторону - когда тебе нужно знание о полке, где стояла книга?
Может, лучше иметь отдельную сущность - ВыдачаКниги? Вот она вполне может знать, где что стояло, и кто взял, и когда взял, и вернуть книгу на место по факту возврата.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы