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

fisa fisadev en gmail.com
Mar Mar 8 20:29:43 ART 2016


On Tue, Mar 8, 2016 at 5:41 PM XLJ xlj <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> wrote:
>
>
>
> 2016-03-08 17:24 GMT-03:00 XLJ xlj <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> wrote:
>>
>>
>>
>> 2016-03-08 17:05 GMT-03:00 XLJ xlj <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)
>>
>>
>>
>>> de antemano gracias!! espero que alguien me pueda orientar
>>>
>>> _______________________________________________
>>> 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
>>>
>>
>> _______________________________________________
>> 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
>>
>>
>>
>> _______________________________________________
>> 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
>>
>
> _______________________________________________
> 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
>
>
> _______________________________________________
> 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



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
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20160308/8e52539d/attachment-0001.html>


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