fork download
  1. # encoding: utf-8
  2. # Biblioteca
  3.  
  4.  
  5. from datetime import date
  6. import pickle
  7.  
  8.  
  9. # 1. Crea una clase Libro, que guarde título, autor,
  10. # editorial, y fecha de devolución.
  11. class Libro:
  12. def __init__(self, titulo, autor, editorial):
  13. self.autor = titulo
  14. self.titulo = autor
  15. self.editorial = editorial
  16. self.fecha_devolucion = date.min
  17.  
  18. def pon_fecha_devolucion (self, nuevaFecha):
  19. self.fecha_devolucion = nuevaFecha
  20.  
  21. # 2. Crea la funcionalidad esta_prestado(), que devuelve True si el libro
  22. # ya ha sido devuelto, y False en otro caso. No crear ningún método.
  23. # getstate y setstate son necesario debido a que la clase emplea
  24. # getattr.
  25. def __getstate__(self):
  26. return self.__dict__
  27.  
  28. def __setstate__(self, d):
  29. self.__dict__ = d
  30.  
  31. def __getattr__(self, item):
  32. if item == "esta_prestado":
  33. return lambda: ( self.fecha_devolucion > date.today() )
  34.  
  35. def __str__(self):
  36. return "{0}, {1} {2}".format(self.titulo, self.autor, self.editorial)
  37.  
  38.  
  39. # 3. Crea también la clase biblioteca, que guarda libros.
  40. # Tendrá un método inserta(l) que permitirá añadir el libro l.
  41. # También el método get(i), que devolverá l libro en la posición i.
  42. # Necesitamos un constructor __init__() y también __str__()
  43. # 4. Utilizando el módulo Pickle, crear el método estático
  44. # carga(nf), que recupera los objetos libro de un archivo de nombre nf,
  45. # y el método guarda(nf) que guarda los libros en un archivo de nombre nf.
  46. class Biblioteca:
  47. def __init__(self):
  48. self.__libros = []
  49.  
  50. def inserta(self, l):
  51. self.__libros += [l]
  52.  
  53. def get(self, i):
  54. return self.__libros[i]
  55.  
  56. def guarda(self, nf):
  57. with open(nf, "wb") as f:
  58. for l in self.__libros:
  59. pickle.dump(l, f)
  60.  
  61. @staticmethod
  62. def carga(nf):
  63. toret = Biblioteca()
  64.  
  65. try:
  66. with open(nf, "rb") as f:
  67. while(True):
  68. toret.inserta(pickle.load(f))
  69. finally:
  70. return toret
  71.  
  72. def __len__(self):
  73. return len(self.__libros)
  74.  
  75. def __str_uxio__(self):
  76. toret = ""
  77.  
  78. for libro in self.__libros:
  79. toret += str(libro) + "\n"
  80.  
  81. return toret
  82.  
  83. def __str__(self):
  84. #return str.join("\n", [str(l) for l in self.__libros])
  85. return ("\n".join([str(l) for l in self.__libros]))
  86.  
  87.  
  88. if __name__ == "__main__":
  89. b = Biblioteca.carga("biblio.dat")
  90.  
  91. if len(b) == 0:
  92. print("Creando (sin datos...)")
  93. l1 = Libro( "El conde de montecristo", "Alejandro Dumas", "Timun-Mas")
  94. l1.pon_fecha_devolucion(date(2017, 5, 9))
  95.  
  96. l2 = Libro("Viaje al centro de la Tierra", "Julio Verne", "Timun-Mas")
  97. l2.pon_fecha_devolucion(date(2017, 5, 1))
  98.  
  99. b.inserta(l1)
  100. b.inserta(l2)
  101. else:
  102. l1 = b.get(0)
  103. l2 = b.get(1)
  104. print("Recuperado de archivo.")
  105.  
  106. b.guarda("biblio.dat")
  107. print(b)
  108.  
  109. print("Prestado 'el conde...':", l1.esta_prestado())
  110. print("Prestado 'viaje al...':", l2.esta_prestado())
  111.  
Runtime error #stdin #stdout #stderr 0.02s 28640KB
stdin
Standard input is empty
stdout
Creando (sin datos...)
stderr
Traceback (most recent call last):
  File "./prog.py", line 106, in <module>
  File "./prog.py", line 57, in guarda
PermissionError: [Errno 13] Permission denied: 'biblio.dat'