# encoding: utf-8
# Biblioteca
from datetime import date
import pickle
# 1. Crea una clase Libro, que guarde título, autor,
# editorial, y fecha de devolución.
class Libro:
def __init__(self, titulo, autor, editorial):
self.autor = titulo
self.titulo = autor
self.editorial = editorial
self.fecha_devolucion = date.min
def pon_fecha_devolucion (self, nuevaFecha):
self.fecha_devolucion = nuevaFecha
# 2. Crea la funcionalidad esta_prestado(), que devuelve True si el libro
# ya ha sido devuelto, y False en otro caso. No crear ningún método.
# getstate y setstate son necesario debido a que la clase emplea
# getattr.
def __getstate__(self):
return self.__dict__
def __setstate__(self, d):
self.__dict__ = d
def __getattr__(self, item):
if item == "esta_prestado":
return lambda: ( self.fecha_devolucion > date.today() )
def __str__(self):
return "{0}, {1} {2}".format(self.titulo, self.autor, self.editorial)
# 3. Crea también la clase biblioteca, que guarda libros.
# Tendrá un método inserta(l) que permitirá añadir el libro l.
# También el método get(i), que devolverá l libro en la posición i.
# Necesitamos un constructor __init__() y también __str__()
# 4. Utilizando el módulo Pickle, crear el método estático
# carga(nf), que recupera los objetos libro de un archivo de nombre nf,
# y el método guarda(nf) que guarda los libros en un archivo de nombre nf.
class Biblioteca:
def __init__(self):
self.__libros = []
def inserta(self, l):
self.__libros += [l]
def get(self, i):
return self.__libros[i]
def guarda(self, nf):
with open(nf, "wb") as f:
for l in self.__libros:
pickle.dump(l, f)
@staticmethod
def carga(nf):
toret = Biblioteca()
try:
with open(nf, "rb") as f:
while(True):
toret.inserta(pickle.load(f))
finally:
return toret
def __len__(self):
return len(self.__libros)
def __str_uxio__(self):
toret = ""
for libro in self.__libros:
toret += str(libro) + "\n"
return toret
def __str__(self):
#return str.join("\n", [str(l) for l in self.__libros])
return ("\n".join([str(l) for l in self.__libros]))
if __name__ == "__main__":
b = Biblioteca.carga("biblio.dat")
if len(b) == 0:
print("Creando (sin datos...)")
l1 = Libro( "El conde de montecristo", "Alejandro Dumas", "Timun-Mas")
l1.pon_fecha_devolucion(date(2017, 5, 9))
l2 = Libro("Viaje al centro de la Tierra", "Julio Verne", "Timun-Mas")
l2.pon_fecha_devolucion(date(2017, 5, 1))
b.inserta(l1)
b.inserta(l2)
else:
l1 = b.get(0)
l2 = b.get(1)
print("Recuperado de archivo.")
b.guarda("biblio.dat")
print(b)
print("Prestado 'el conde...':", l1.esta_prestado())
print("Prestado 'viaje al...':", l2.esta_prestado())
IyBlbmNvZGluZzogdXRmLTgKIyBCaWJsaW90ZWNhCgoKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZQppbXBvcnQgcGlja2xlCgoKIyAxLiBDcmVhIHVuYSBjbGFzZSBMaWJybywgcXVlIGd1YXJkZSB0w610dWxvLCBhdXRvciwKIyBlZGl0b3JpYWwsIHkgZmVjaGEgZGUgZGV2b2x1Y2nDs24uCmNsYXNzIExpYnJvOgogICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpdHVsbywgYXV0b3IsIGVkaXRvcmlhbCk6CiAgICAgICAgc2VsZi5hdXRvciA9IHRpdHVsbwogICAgICAgIHNlbGYudGl0dWxvID0gYXV0b3IKICAgICAgICBzZWxmLmVkaXRvcmlhbCA9IGVkaXRvcmlhbAogICAgICAgIHNlbGYuZmVjaGFfZGV2b2x1Y2lvbiA9IGRhdGUubWluCgogICAgZGVmIHBvbl9mZWNoYV9kZXZvbHVjaW9uIChzZWxmLCBudWV2YUZlY2hhKToKICAgICAgICBzZWxmLmZlY2hhX2Rldm9sdWNpb24gPSBudWV2YUZlY2hhCgogICAgIyAyLiBDcmVhIGxhIGZ1bmNpb25hbGlkYWQgZXN0YV9wcmVzdGFkbygpLCBxdWUgZGV2dWVsdmUgVHJ1ZSBzaSBlbCBsaWJybwogICAgIyB5YSBoYSBzaWRvIGRldnVlbHRvLCB5IEZhbHNlIGVuIG90cm8gY2Fzby4gTm8gY3JlYXIgbmluZ8O6biBtw6l0b2RvLgogICAgIyBnZXRzdGF0ZSB5IHNldHN0YXRlIHNvbiBuZWNlc2FyaW8gZGViaWRvIGEgcXVlIGxhIGNsYXNlIGVtcGxlYQogICAgIyBnZXRhdHRyLgogICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXwoKICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZCk6CiAgICAgICAgc2VsZi5fX2RpY3RfXyA9IGQKCiAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgaXRlbSk6CiAgICAgICAgaWYgaXRlbSA9PSAiZXN0YV9wcmVzdGFkbyI6CiAgICAgICAgICAgIHJldHVybiBsYW1iZGE6ICggc2VsZi5mZWNoYV9kZXZvbHVjaW9uID4gZGF0ZS50b2RheSgpICkKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICByZXR1cm4gInswfSwgezF9IHsyfSIuZm9ybWF0KHNlbGYudGl0dWxvLCBzZWxmLmF1dG9yLCBzZWxmLmVkaXRvcmlhbCkKCgojIDMuIENyZWEgdGFtYmnDqW4gbGEgY2xhc2UgYmlibGlvdGVjYSwgcXVlIGd1YXJkYSBsaWJyb3MuCiMgVGVuZHLDoSB1biBtw6l0b2RvIGluc2VydGEobCkgcXVlIHBlcm1pdGlyw6EgYcOxYWRpciBlbCBsaWJybyBsLgojIFRhbWJpw6luIGVsIG3DqXRvZG8gZ2V0KGkpLCBxdWUgZGV2b2x2ZXLDoSBsIGxpYnJvIGVuIGxhIHBvc2ljacOzbiBpLgojIE5lY2VzaXRhbW9zIHVuIGNvbnN0cnVjdG9yIF9faW5pdF9fKCkgeSB0YW1iacOpbiBfX3N0cl9fKCkKIyA0LiBVdGlsaXphbmRvIGVsIG3Ds2R1bG8gUGlja2xlLCBjcmVhciBlbCBtw6l0b2RvIGVzdMOhdGljbwojIGNhcmdhKG5mKSwgcXVlIHJlY3VwZXJhIGxvcyBvYmpldG9zIGxpYnJvIGRlIHVuIGFyY2hpdm8gZGUgbm9tYnJlIG5mLAojIHkgZWwgbcOpdG9kbyBndWFyZGEobmYpIHF1ZSBndWFyZGEgbG9zIGxpYnJvcyBlbiB1biBhcmNoaXZvIGRlIG5vbWJyZSBuZi4KY2xhc3MgQmlibGlvdGVjYToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzZWxmLl9fbGlicm9zID0gW10KCiAgICBkZWYgaW5zZXJ0YShzZWxmLCBsKToKICAgICAgICBzZWxmLl9fbGlicm9zICs9IFtsXQoKICAgIGRlZiBnZXQoc2VsZiwgaSk6CiAgICAgICAgcmV0dXJuIHNlbGYuX19saWJyb3NbaV0KCiAgICBkZWYgZ3VhcmRhKHNlbGYsIG5mKToKICAgICAgICB3aXRoIG9wZW4obmYsICJ3YiIpIGFzIGY6CiAgICAgICAgICAgIGZvciBsIGluIHNlbGYuX19saWJyb3M6CiAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChsLCBmKQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBjYXJnYShuZik6CiAgICAgICAgdG9yZXQgPSBCaWJsaW90ZWNhKCkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICB3aXRoIG9wZW4obmYsICJyYiIpIGFzIGY6CiAgICAgICAgICAgICAgICB3aGlsZShUcnVlKToKICAgICAgICAgICAgICAgICAgICB0b3JldC5pbnNlcnRhKHBpY2tsZS5sb2FkKGYpKQogICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgIHJldHVybiB0b3JldAoKICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fX2xpYnJvcykKCiAgICBkZWYgX19zdHJfdXhpb19fKHNlbGYpOgogICAgICAgIHRvcmV0ID0gIiIKCiAgICAgICAgZm9yIGxpYnJvIGluIHNlbGYuX19saWJyb3M6CiAgICAgICAgICAgIHRvcmV0ICs9IHN0cihsaWJybykgKyAiXG4iCgogICAgICAgIHJldHVybiB0b3JldAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICNyZXR1cm4gc3RyLmpvaW4oIlxuIiwgW3N0cihsKSBmb3IgbCBpbiBzZWxmLl9fbGlicm9zXSkKICAgICAgICByZXR1cm4gKCJcbiIuam9pbihbc3RyKGwpIGZvciBsIGluIHNlbGYuX19saWJyb3NdKSkKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgYiA9IEJpYmxpb3RlY2EuY2FyZ2EoImJpYmxpby5kYXQiKQoKICAgIGlmIGxlbihiKSA9PSAwOgogICAgICAgIHByaW50KCJDcmVhbmRvIChzaW4gZGF0b3MuLi4pIikKICAgICAgICBsMSA9IExpYnJvKCAiRWwgY29uZGUgZGUgbW9udGVjcmlzdG8iLCAiQWxlamFuZHJvIER1bWFzIiwgIlRpbXVuLU1hcyIpCiAgICAgICAgbDEucG9uX2ZlY2hhX2Rldm9sdWNpb24oZGF0ZSgyMDE3LCA1LCA5KSkKCiAgICAgICAgbDIgPSBMaWJybygiVmlhamUgYWwgY2VudHJvIGRlIGxhIFRpZXJyYSIsICJKdWxpbyBWZXJuZSIsICJUaW11bi1NYXMiKQogICAgICAgIGwyLnBvbl9mZWNoYV9kZXZvbHVjaW9uKGRhdGUoMjAxNywgNSwgMSkpCgogICAgICAgIGIuaW5zZXJ0YShsMSkKICAgICAgICBiLmluc2VydGEobDIpCiAgICBlbHNlOgogICAgICAgIGwxID0gYi5nZXQoMCkKICAgICAgICBsMiA9IGIuZ2V0KDEpCiAgICAgICAgcHJpbnQoIlJlY3VwZXJhZG8gZGUgYXJjaGl2by4iKQoKICAgIGIuZ3VhcmRhKCJiaWJsaW8uZGF0IikKICAgIHByaW50KGIpCgogICAgcHJpbnQoIlByZXN0YWRvICdlbCBjb25kZS4uLic6IiwgbDEuZXN0YV9wcmVzdGFkbygpKQogICAgcHJpbnQoIlByZXN0YWRvICd2aWFqZSBhbC4uLic6IiwgbDIuZXN0YV9wcmVzdGFkbygpKQo=