book.shelf = super(BookShelfRef,shelf)
вместо book.shelf = shelf
Полка книг наследуется от базового класса который не включается в себя список книг, специально для того чтобы книга могла ссылаться на полку, на которой находится.И из этого таки и не понятно, зачем делать все таки делать shelf: BookShelfRef а не shelf: BookShelf ? Она в обоих случаях на полку ссылается.
book.shelf = BookShelfRef(name=shelf.name)
либо написать фабричный метод для подобных преобразований