Foros del Web » Programando para Internet » Python »

Instanciar objetos y guardarlos en un vector

Estas en el tema de Instanciar objetos y guardarlos en un vector en el foro de Python en Foros del Web. Hola, primero que todo saludar porque soy nuevo en el foro. Resulta que soy novatísimo en Python, y estoy haciendo una biblioteca. Resulta que tengo ...
  #1 (permalink)  
Antiguo 30/06/2010, 19:00
 
Fecha de Ingreso: junio-2010
Mensajes: 1
Antigüedad: 13 años, 10 meses
Puntos: 0
Instanciar objetos y guardarlos en un vector

Hola, primero que todo saludar porque soy nuevo en el foro. Resulta que soy novatísimo en Python, y estoy haciendo una biblioteca.

Resulta que tengo la siguiente clase Libro ya definida (en python, está bien verdad?):

Código:
class libro:
  def __init__(self, idLibro, titulo, autor, edicion,  editorial):
      self.idLibro=idLibro
      self.titulo=titulo
       self.autor=autor
      self.edicion=edicion
       self.editorial=editorial
  
  def getIdLibro(self):
       return self.idLibro
    
  def setIdLibro(self, id):
       self.idLibro = id
        
  def getTitulo(self):
      return  self.titulo
    
  def setTitulo(self, titulo):
       self.titulo = titulo
        
  def getAutor(self):
       return self.autor

  def setAutor(self, autor):
       self.autor = autor
  
  def getEdicion(self):
      return  self.edicion

  def setEdicion(self, edicion):
       self.edicion = edicion
  
  def getEditorial(self):
       return self.editorial

  def setEditorial(self, editorial):
       self.editorial = editorial
Resulta que necesito agregar, listar, buscar y eliminar los libros que los quiero ir almacenando en un vector. El problema es que nose como manejar un vector en Python, en Java algo asi para agregar digamos...:

Código:
public class AdministracionLibros {

    private Menu menu = new Menu();
    private static Vector<Libro> libros = new  Vector<Libro>();

        public boolean agregarLibro(int idLibro, String titulo, String  autor, String edicion, String editorial) {

        libros.add(new Libro());
        libros.get(libros.size()-1).setIdLibro(idLibro);
        libros.get(libros.size()-1).setTitulo(titulo);
        libros.get(libros.size()-1).setAutor(autor):
        libros.get(libros.size()-1).setEdicion(edicion):
        libros.get(libros.size()-1).setEditorial(editorial):
        return true;
        }
Espero que puedan ayudarme =)

Para buscar tengo algo asi:

Código:
def buscarLibroPorNombre(self, nombreLibro):
        self.libros=[]
        nombreLibro = raw_input('Ingrese el nombre: ')

        for i in range(len(libros)):
            if nombreLibro in libros:
                print 'El libro está en la posicion: ' + libros[i]
            else:
                print 'El libro no está ingresado'
  #2 (permalink)  
Antiguo 30/06/2010, 20:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Instanciar objetos y guardarlos en un vector

Bienvenido al foro mirkodrpic:

En esta caso te recomiendo varias cosas:

1.- No definir métodos get y set si tus miembros de clase son públicos.
2.- Para este problema te recomendaría usar un diccionario en lugar de un vector.

Ahora bien cabe aclarar las diferencias entre vector y list:
Un vector es un arreglo que puede crecer esto significa memoria contigua.
En cambio una lista es una estructura de datos y por lo tanto no garantiza memoria contigua.
Ambos tienen sus ventajas y desventajas, pero para una cantidad inmensa de datos es mejor una lista.

Como puedes ver en la documentación de python existen muchos métodos para manejar listas.

Haciendo que el trabajo de agregar, borrar y buscar se reduscan simplemente a funciones tales como append, remove e index.

Ahora bien cuando tenemos una lista de datos "primitivos" (recordemos que en python todo son objetos) no tenemos problemas al trabajar con estos objetos por que tienen los metodos muy bien definidos. En cambio cuando hacemos nuestra clase tenemos que definir esos metodos.

Aquí un ejemplo, perdón por el derroche de creatividad para los datos.
Código Python:
Ver original
  1. #Esta es la clase libro
  2. class Book:
  3.     def __init__(self, idbook, title, author, edition,  editorial):
  4.         self.idbook = idbook
  5.         self.title = title
  6.         self.author = author
  7.         self.edition = edition
  8.         self.editorial = editorial
  9.  
  10.     def __str__(self):
  11.         return self.idbook
  12.  
  13.     def __eq__(self, y):
  14.         if self.idbook == y:
  15.             return True
  16.         return False
  17.  
  18. #Vamos a definir unas cuantas funciones
  19.  
  20. #Como añadir libros
  21. def add_book(book_list, book):
  22.     book_list.append(book)
  23.     print "Añadido %s exitosamente" % book.idbook
  24.  
  25. #Busca libro SOLO por id
  26. def search_book(book_list, book_id):
  27.     try:
  28.         index = book_list.index(book_id)
  29.         print "%s esta en el registro %d" % (book_id, index)
  30.     except ValueError:
  31.         print "%s NO esta en el registro" % book_id
  32.  
  33. #Borra libro por id
  34. def delete_book(book_list, book_id):
  35.     try:
  36.         book_list.remove(book_id)
  37.         print "%s se ha borrado exitosamente" % book_id
  38.     except ValueError:
  39.         print "%s NO esta en el registro" % book_id
  40.  
  41. l = []
  42. add_book(l, Book("001", "Titulo1", "Autor1", "Edicion1", "Editorial1") )
  43. add_book(l, Book("002", "Titulo2", "Autor2", "Edicion2", "Editorial2") )
  44. add_book(l, Book("003", "Titulo3", "Autor3", "Edicion3", "Editorial3") )
  45. add_book(l, Book("004", "Titulo4", "Autor4", "Edicion4", "Editorial4") )
  46. add_book(l, Book("005", "Titulo5", "Autor5", "Edicion5", "Editorial5") )
  47.  
  48. search_book(l, "005")
  49. search_book(l, "000")
  50.  
  51. delete_book(l, "004")
  52. delete_book(l, "004")

Si modificamos el método __eq__ podemos hacer búsquedas y remover libros de la lista ya sea por edición, titulo, autor, etc...
  #3 (permalink)  
Antiguo 30/06/2010, 21:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Instanciar objetos y guardarlos en un vector

Aqui un ejemplo mas bonito y simplificado:
Código Python:
Ver original
  1. class Book(object):
  2.     def __init__(self, idbook, title, author, edition,  editorial):
  3.         self.idbook = idbook
  4.         self.title = title
  5.         self.author = author
  6.         self.edition = edition
  7.         self.editorial = editorial
  8.  
  9.     def __str__(self):
  10.         return "%s %s %s %s %s" % (self.idbook, self.title, self.author, self.edition, self.editorial)
  11.  
  12.     def __getattribute__(self, attr):
  13.         return object.__getattribute__(self, attr)
  14.  
  15. class BookManager:
  16.     def __init__(self):
  17.         self.book_list = []
  18.  
  19.     def append(self, idbook, title, author, edition,  editorial):
  20.         book = Book(idbook, title, author, edition,  editorial)
  21.         self.book_list.append(book)
  22.  
  23.     def search(self, key, by="idbook"):
  24.         for index, book in enumerate(self.book_list):
  25.             if book.__getattribute__(by) == key:
  26.                 return index
  27.  
  28.     def remove(self, key, by="idbook"):
  29.         index = self.search(key)
  30.         if index != None:
  31.             self.book_list.pop(index)
  32.             return index
  33.  
  34.     def __str__(self):
  35.         s = ""
  36.         for book in self.book_list:
  37.             s += str(book) + '\n'
  38.         return s
  39.  
  40. #Ejemplo:
  41. bm = BookManager()
  42.  
  43. bm.append("001", "Title1", "Author1", "Edition1", "Editorial1")
  44. bm.append("002", "Title2", "Author2", "Edition2", "Editorial2")
  45. bm.append("003", "Title3", "Author3", "Edition3", "Editorial3")
  46. bm.append("004", "Title4", "Author4", "Edition4", "Editorial4")
  47. bm.append("005", "Title5", "Author5", "Edition5", "Editorial5")
  48.  
  49. bm.search("000")
  50. bm.search("001")
  51.  
  52. bm.remove("004")
  53. bm.remove("004")
  54.  
  55. print bm

Etiquetas: objetos, vectores
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:59.