@NakedFace

Как правильно перегружать оператор +=, работая с экземплярами класса, в Python?

Здравствуйте.
Есть класс Библиотека и класс Книга.
Нужно чтобы программа работала так:

lib = Library(1, ’51 Some str., NY’)
lib += Book(‘Leo Tolstoi’, ‘War and Peace’)

В классе Библиотеки создал массив books для хранения книг, перегрузил оператор +=, чтобы в этот массив добавлялись объекты. Но после вызова оператора теряется доступ к этой переменной (выдает ошибку на lib.books). Хотя вызова доступ есть.
Вот код программы:
class Book(object):
    def __init__(self, name, author):
        if name == "":
            raise "Book name mustn't be empty"
        self._name = name
        self._autor = author
        self._code = 0

    @property
    def name(self):
        return self._name

    @property
    def autor(self):
        return self._autor

    def tag(self):
        return [word for word in self._name.split(' ') if word[:1].isupper()]

    def __iter__(self):
        yield [self._code, self._name, self._autor]

    def __str__(self):
        return "[{0}] {1} {2}".format(self._code, self._autor, self._name)


class Library(object):
    def __init__(self, address, number):
        self._address = address
        self._number = number
        self._books = []

    @property
    def address(self):
        return self._address

    @property
    def number(self):
        return self._number

    @property
    def books(self):
        return self._books

    def __iadd__(self, book):
        self._books.append(book)
        # print(book.tag())

    def __iter__(self):
        yield self._books

И main.py:
from book import Book
from library import Library

book = Book('War and Peace', 'Tolstoi')
lib = Library(1, '51 Some str., NY')

print(book.name)
print(book.autor)
print(book.tag())
print(book)

print(lib.books) # => []
lib += book
print(lib.books) # => AttributeError: 'NoneType' object has no attribute 'books'


Заранее спасибо!
  • Вопрос задан
  • 285 просмотров
Решения вопроса 1
@NakedFace Автор вопроса
Нужно дописать return self в перегрузку.
def __iadd__(self, book):
        self._books.append(book)
        return self
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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