[pyar] xDuda con como acceder a un método de un objeto dentro de una lista

XLJ xlj xlj707 en gmail.com
Mar Mar 8 20:50:36 ART 2016


Entendido master tomare muy en cuenta tus consejos,, por otro lado, el programa ya imprimir (vacía la lista de objetos correctamente) ahora intento serializar aquí en python llevo toda la tarde buscando información, sin embargo no logro dar en el clavo, me enfoque a usar codificación JSON y en resumen de cuentas (con la info recolectada) para codificar mi lista de libros (según yo) quedaría así, el problema es, que no lo estoy haciendo bien! 

# en este modulo tendre la estanteria de libros (listas)
from libro import Libro
import json
# titulo, anio, autor, paginas, editorial, codigoLibro



# llenado de la estanteria
lib1 = Libro("Alicia en el pais de las maravillas", 1999, "lucson marz", 200, "MCgraw Hill", "AHSBCr31")
lib2 = Libro("Peter Pan", 1985, "J. M. Barrie", 206, "A Millennium Fulcrum Edition", "HALSDF232")
lib3 = Libro("Oliver tweest", 1855, "Charles Dikenson", 120, "Porrua", "ASDFAS235")
lib4 = Libro("La Odisea", 1530, "Homero", 950, "Porrua", "ASDFASDF323")
lib5 = Libro("La iliada ", 1532, "Homero", 1300, "Porrua", "ADSFASD9032")
lib6 = Libro("La hojarasca", 1960, "Gabriel Garcia Marquez", 180, "Editorial Latina", "ADF3235ASD")

libros = [lib1, lib2, lib3, lib4, lib5, lib6]  # 6 libros

# vaciado de la lista
def listarLibros():
    for object in libros:
    	print(object.showInfo(), "\n", object.getCodigoLibro() ) 
    menu()

def eliminarTitulo(): 
	print("eliminar titulo")
	menu() 
def agregarTitulo(): 
	#para agregar un titulo primero creamos una nueva instancia de Libro 
	#para esto pedimos cada uno de los atributos requeridos 
	titulo = input("cual es el titulo: ")
	anio = input("ingresa el anio: ")
	autor = input("ingresa el autor: ")
	paginas = input("cuantas pagias tiene el libro? ")
	editorial = input("de que editorial es? ")
	claveLibro = input("ingresa un codigo alfanumerico para el libro: ")


	lib7 = Libro(titulo, anio, autor, paginas, editorial, claveLibro)
	libros.append(lib7)
	#ahora convertimos el objeto python en JSON 
	with open('data.json','w') as f: 
		json.dump(libros, f)
	
	print("libro agregado con exito!! ")

	menu()


def tempLeerJson(): 
	with open('data.json','r') as f: 
		libros = json.load(f)

	menu()

def salir(): 
	print("salir.....")


def menu(): 
	opcion = input("Operaciones: \n\t 1) listar material \n\t 2) eliminar Titulo \n\t 3) agregar titulo \n\t 4) leer archivo json \n\t 5) salir ")#todos los metodos manipularan archivos 
	#emulamos switch 
	operaciones = {'1':listarLibros, '2':eliminarTitulo, '3':agregarTitulo, '4':tempLeerJson, '5':salir}

	operaciones[opcion]()


el resultado es : 

MacBook-Pro-de-X:clases xlj707$ python3 estanteriaMaterial.py 
Operaciones: 
	 1) listar material 
	 2) eliminar Titulo 
	 3) agregar titulo 
	 4) leer archivo json 
	 5) salir 4
Traceback (most recent call last):
  File "estanteriaMaterial.py", line 70, in <module>
    menu()
  File "estanteriaMaterial.py", line 64, in menu
    operaciones[opcion]()
  File "estanteriaMaterial.py", line 51, in tempLeerJson
    libros = json.load(f)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/__init__.py", line 268, in load
    parse_constant=parse_constant, object_pairs_hook=object_pairs_hook, **kw)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/__init__.py", line 318, in loads
    return _default_decoder.decode(s)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/decoder.py", line 343, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/json/decoder.py", line 361, in raw_decode
    raise ValueError(errmsg("Expecting value", s, err.value)) from None
ValueError: Expecting value: line 1 column 2 (char 1)




    
menu()

> On Mar 8, 2016, at 5:29 PM, fisa <fisadev en gmail.com> wrote:
> 
> On Tue, Mar 8, 2016 at 5:41 PM XLJ xlj <xlj707 en gmail.com <mailto:xlj707 en gmail.com>> wrote:
> COMO SE define el __str__ en la calse Libro ???? 
> 
> ya logre listar todo, mi error era que en cada clase hija estaba  escribiendo nuevamente el método showInfo y esto no era necesario ya que la clase padre Ejemplar ya cuenta con el. 
> 
> MacBook-Pro-de-X:clases xlj707$ python3 estanteriaMaterial.py 
> titulo:  Alicia en el pais de las maravillas
> anio:  1999
> autor:  lucson marz
> paginas:  200
> editorial:  MCgraw Hill
> None
> titulo:  Peter Pan
> anio:  1985
> autor:  J. M. Barrie
> paginas:  206
> editorial:  A Millennium Fulcrum Edition
> None
> titulo:  Oliver tweest
> anio:  1855
> autor:  Charles Dikenson
> paginas:  120
> editorial:  Porrua
> None
> titulo:  La Odisea
> anio:  1530
> autor:  Homero
> paginas:  950
> editorial:  Porrua
> None
> titulo:  La iliada 
> anio:  1532
> autor:  Homero
> paginas:  1300
> editorial:  Porrua
> None
> titulo:  La hojarasca
> anio:  1960
> autor:  Gabriel Garcia Marquez
> paginas:  180
> editorial:  Editorial Latina
> None
> 
> 
> AHORA LO QUE NO PUEDO HACER ES INGRESAR al getter propio de libro que es getCodigoLibro(): return self.__codigolibro , el cual es un atributo propio solo de la clase Libro
> 
> 
> 
>> On Mar 8, 2016, at 2:34 PM, Tomas Zulberti <tzulberti en gmail.com <mailto:tzulberti en gmail.com>> wrote:
>> 
>> 
>> 
>> 2016-03-08 17:24 GMT-03:00 XLJ xlj <xlj707 en gmail.com <mailto:xlj707 en gmail.com>>:
>> # en este modulo tendre la estanteria de libros (listas)
>> from libro import Libro
>> 
>> # titulo, anio, autor, paginas, editorial, codigoLibro
>> 
>> 
>> 
>> # llenado de la estanteria
>> lib1 = Libro("Alicia en el pais de las maravillas", 1999, "lucson marz", 200, "MCgraw Hill", "AHSBCr31")
>> lib2 = Libro("Peter Pan", 1985, "J. M. Barrie", 206, "A Millennium Fulcrum Edition", "HALSDF232")
>> lib3 = Libro("Oliver tweest", 1855, "Charles Dikenson", 120, "Porrua", "ASDFAS235")
>> lib4 = Libro("La Odisea", 1530, "Homero", 950, "Porrua", "ASDFASDF323")
>> lib5 = Libro("La iliada ", 1532, "Homero", 1300, "Porrua", "ADSFASD9032")
>> lib6 = Libro("La hojarasca", 1960, "Gabriel Garcia Marquez", 180, "Editorial Latina", "ADF3235ASD")
>> 
>> libros = [lib1, lib2, lib3, lib4, lib5, lib6]  # 6 libros
>> 
>> 
>> # test de vaciado de la lista
>> def listar():
>>     for object in libros:
>>     	print(object)
>> 
>> 
>> 
>> 
>> listar()
>> 
>> MacBook-Pro-de-X:clases xlj707$ python3 estanteriaMaterial.py 
>> <libro.Libro object at 0x10133a4a8>
>> <libro.Libro object at 0x10133a4e0>
>> <libro.Libro object at 0x10133a518>
>> <libro.Libro object at 0x10133a588>
>> <libro.Libro object at 0x10133a860>
>> <libro.Libro object at 0x10133a8d0>
>> 
>> 
>> 
>> Eso es porque no definiste el __str__ en la clase libro. 
>> 
>> 
>>  
>>  Y USANDO EL CODIGO ASI : 
>> 
>> # en este modulo tendre la estanteria de libros (listas)
>> from libro import Libro
>> 
>> # titulo, anio, autor, paginas, editorial, codigoLibro
>> 
>> 
>> 
>> # llenado de la estanteria
>> lib1 = Libro("Alicia en el pais de las maravillas", 1999, "lucson marz", 200, "MCgraw Hill", "AHSBCr31")
>> lib2 = Libro("Peter Pan", 1985, "J. M. Barrie", 206, "A Millennium Fulcrum Edition", "HALSDF232")
>> lib3 = Libro("Oliver tweest", 1855, "Charles Dikenson", 120, "Porrua", "ASDFAS235")
>> lib4 = Libro("La Odisea", 1530, "Homero", 950, "Porrua", "ASDFASDF323")
>> lib5 = Libro("La iliada ", 1532, "Homero", 1300, "Porrua", "ADSFASD9032")
>> lib6 = Libro("La hojarasca", 1960, "Gabriel Garcia Marquez", 180, "Editorial Latina", "ADF3235ASD")
>> 
>> libros = [lib1, lib2, lib3, lib4, lib5, lib6]  # 6 libros
>> 
>> 
>> # test de vaciado de la lista
>> def listar():
>>     for object in libros:
>>     	print(object.showInfo())
>> 
>> 
>> 
>> 
>> listar()
>> 
>> MacBook-Pro-de-X:clases xlj707$ python3 estanteriaMaterial.py 
>> Traceback (most recent call last):
>>   File "estanteriaMaterial.py", line 27, in <module>
>>     listar()
>>   File "estanteriaMaterial.py", line 22, in listar
>>     print(object.showInfo())
>>   File "/Users/xlj707/Documents/Misproyectitos-python/ArchivoJson/clases/libro.py", line 14, in showInfo
>>     print("titulo: ", self.__titulo)
>> AttributeError: 'Libro' object has no attribute '_Libro__titulo'
>> MacBook-Pro-de-X:clases xlj707$ 
>> 
>> 
>> 
>> 
>> Lo que te dice ese mensaje es que la clase "Libro" no tiene el attributo de __titulo no tiene el atributo que por ahi pertence a Ejemplar, pero que es "privado" y por lo tanto no lo podes acceder.
>> 
>> Para accederlo desde libro deberias hacer algo como esto:
>> 
>> 
>> print("titulo", self._Ejemplar__titulo)
>>  
>>> On Mar 8, 2016, at 2:15 PM, Tomas Zulberti <tzulberti en gmail.com <mailto:tzulberti en gmail.com>> wrote:
>>> 
>>> 
>>> 
>>> 2016-03-08 17:05 GMT-03:00 XLJ xlj <xlj707 en gmail.com <mailto:xlj707 en gmail.com>>:
>>> #clase libro 
>>> 
>>> from ejemplar import Ejemplar 
>>> 
>>> class Libro(Ejemplar): 
>>>    def __init__(self, titulo, anio, autor, paginas, editorial, codigoLibro): 
>>>       Ejemplar.__init__(self, titulo, anio, autor, paginas, editorial) #super
>>>       self.__codigolibro = codigoLibro #atributo adicional propio de esta clase 
>>> 
>>>    def getCodigoLibro(): 
>>>       return self.__codigolibro
>>> 
>>>    def showInfo(self):
>>>       print("titulo: ", self.__titulo)
>>>       print("anio: ", self.__anio)
>>>       print("autor: ", self.__autor)
>>>       print("paginas: ", self.__paginas)
>>>       print("editorial: ", self.__editorial)
>>>       print("codigo de libro: ", self.__codigolibro)
>>> 
>>> 
>>> 
>>> # en este modulo tendre la estanteria de libros (listas)
>>> from libro import Libro
>>> 
>>> # titulo, anio, autor, paginas, editorial, codigoLibro
>>> 
>>> 
>>> 
>>> # llenado de la estanteria
>>> lib1 = Libro("Alicia en el pais de las maravillas", 1999, "lucson marz", 200, "MCgraw Hill", "AHSBCr31")
>>> lib2 = Libro("Peter Pan", 1985, "J. M. Barrie", 206, "A Millennium Fulcrum Edition", "HALSDF232")
>>> lib3 = Libro("Oliver tweest", 1855, "Charles Dikenson", 120, "Porrua", "ASDFAS235")
>>> lib4 = Libro("La Odisea", 1530, "Homero", 950, "Porrua", "ASDFASDF323")
>>> lib5 = Libro("La iliada ", 1532, "Homero", 1300, "Porrua", "ADSFASD9032")
>>> lib6 = Libro("La hojarasca", 1960, "Gabriel Garcia Marquez", 180, "Editorial Latina", "ADF3235ASD")
>>> 
>>> libros = [lib1, lib2, lib3, lib4, lib5, lib6]  # 6 libros
>>> 
>>> 
>>> # test de vaciado de la lista
>>> def listar():
>>>     for object in libros:
>>> 
>>> 
>>> 
>>> 
>>> 
>>> listar()
>>> 
>>> MI DUDA ES LA SIGUIENTE como puedo hacer uso del método showInfor() que es el encargado de listar todas las propiedades del objeto tipo Libro, esto dentro de mi ciclo for 
>>> ya intente con def listar(): 
>>> 	for object in libros 
>>> 		print(object.showInfo()) 
>>> sin embargo esto me da error !! 
>>> 
>>> 
>>> 
>>> Estaria bueno que pongas el mensaje de error que te aparece. 
>>> Por ejemplo, tu codigo corre en Python 3. 
>>> 
>>> Sin embargo, lo que queres hacer es lo siguiente:
>>> 
>>> for object in libros:
>>>     object.showInfo()
>>> 
>>> No es necesario hacer un print de object.showInfo(), porque el mismo ya lo imprime
>>> 
>>>  
>>> 
>>> quiero saber como puedo lograr esto aquí en python ya que en java es totalmente posible (haciendo uso del metodo toString) 
>>> 
>>> 
>>> En python existe un magic method llamado __str__ (http://www.rafekettler.com/magicmethods.html#representations <http://www.rafekettler.com/magicmethods.html#representations>)
>>> 
>>>  
>>> de antemano gracias!! espero que alguien me pueda orientar 
>>> 
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>>> 
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>>> 
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
>>> 
>>> _______________________________________________
>>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>>> 
>>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>>> 
>>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
>> 
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>> 
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>> 
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
>> 
>> _______________________________________________
>> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
>> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
>> 
>> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
>> 
>> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
> _______________________________________________
> pyar mailing list pyar en python.org.ar <mailto:pyar en python.org.ar>
> http://listas.python.org.ar/listinfo/pyar <http://listas.python.org.ar/listinfo/pyar>
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/ <http://www.python.org.ar/>
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar <http://www.usla.org.ar/>
> 
> 
> Buenas! para definir el método __str__, definilo como a cualquier método normal:
> 
> class Libro(Ejemplar): 
>      # ... resto de tu codigo ...
> 
>      def __str__(self):
>         return self.getTitulo()  # o lo que prefieras que se devuelva
> 
> 
> Pero me tomo el tiempo de darte otros consejos que me parecen importantes sobre tu código:
> 
> 1) No uses object como nombre de variable. Ya existe algo que es object, y al usarlo como nombre de variable lo estás pisando, cosa que no está buena. Mejor algo como esto:
> for libro in libros:
>   ...
> 
> 2) No hace falta que definas getters para eso que hiciste! es mucho código al cuete, que no te da ninguna ventaja y te complica las cosas. No es la forma que se acostumbra a hacer en python además, para nada.
> 
> Esta es la forma en la que veo que lo hacés:
> 
>     class Persona:
>         def __init__(self, nombre): 
>             self.__nombre = nombre
> 
>         def getNombre(): 
>             return self.__nombre
> 
>     p = Persona('fisa')
>     print(p.getNombre())
> 
> Y esta sería la forma adecuada normalmente en python:
> 
>     class Persona:
>         def __init__(self, nombre): 
>             self.nombre = nombre
> 
>     p = Persona('fisa')
>     print(p.nombre)
> 
> Fijate que es bastante más legible y simple. Recordá que menos código significa muchas ventajas (menos chances de error, más fácil de entender y debuguear, etc).
> Solo usá getters si necesitás meter lógica especial adentro.
> 
> Saludos! 
> -- 
> --
> fisa  -  Juan Pedro Fisanotti
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
> 
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
> 
> La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org.ar

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160308/1b798abf/attachment-0001.html>


Más información sobre la lista de distribución pyar