[pyar] Clase que encapsula un atributo

Ariel Gerardo Ríos arielgerardorios en gmail.com
Mar Abr 22 16:06:46 ART 2014


Quizás te convenga entrar al objeto no directamente sino por un método de
clase (no lo probé):

class B():
    a = A()

    @classmethod
    def get_object(cls):
        if not a.get_parent() == cls:
            a.set_parent(cls)
        return a

Ahí la misma instancia de A la podés tener metida en otras clases y todas
te darían el parent correcto... pero si hay concurrencia ya se rompe todo :P

Saludos.


2014-04-22 15:57 GMT-03:00 Emiliano Reynares <reynares.emiliano en gmail.com>:

> Había pensado en esa solución, sólo que el atributo que debo inicializar
> es de clase, y sólo deberia ser accesible desde la clase, NO de una
> instancia en particular.
>
>
> 2014-04-22 15:40 GMT-03:00 Ariel Gerardo Ríos <arielgerardorios en gmail.com>
> :
>
> Yo seguiría por el lado de la solución de Luis: las instancias creadas en
>> otros lados podrían tener un método que resetee el valor de parent para que
>> se acomoden al nuevo entorno:
>>
>> #!/usr/bin/env python
>> # -*- coding: utf-8 -*-
>>
>>
>> class A():
>>     def __init__(self, parent=None):
>>         self.set_parent(parent)
>>
>>     def set_parent(self, parent):
>>         self.parent = parent
>>
>>     def get_parent(self):
>>         return self.parent
>>
>>
>> class B():
>>      def __init__(self):
>>         self.a = A(self.__class__)
>>
>>
>> class C:
>>     def __init__(self, a):
>>         self.a = a
>>         self.a.set_parent(self.__class__)
>>
>>
>> if __name__ == '__main__':
>>     b = B()
>>     print b.a.get_parent()
>>
>>     c = C(b.a)
>>     print c.a.get_parent()
>>
>>
>>     Ejecutándolo tenés:
>>
>> $ python test.py
>> __main__.B
>> __main__.C
>>
>>
>>     Pero todo depende de qué tanto acceso tengas a la definición de las
>> clases para poder agregarles este método "set_parent()"
>>
>> Saludos.
>>
>>
>> 2014-04-22 15:18 GMT-03:00 Angel Java Lopez <ajlopez2000 en gmail.com>:
>>
>> Pero cuando instancia A puede estar afuera de B, pasarse la instancia al
>>> constructor de B, y asignarle la instancia al atributo foo de A
>>>
>>> class B(a)
>>>     foo = a
>>>
>>> y en algun lado
>>>
>>> B(A())
>>>
>>> Disculpen, no se si esta bien escrito en Python, espero que se entienda
>>> la idea: la instancia de A puede ser creada en el otro lado de la  luna, y
>>> terminar en un atributo de una instancia de B
>>>
>>>
>>> 2014-04-22 15:14 GMT-03:00 Roberto Alsina <ralsina en netmanagers.com.ar>:
>>>
>>>>  On 22/04/14 15:08, Angel Java Lopez wrote:
>>>>
>>>> En principio no, porque un metodo de instancia SOLO conoce la
>>>> instancia, no los atributos desde donde la instancia esta referenciada.
>>>>
>>>>  Una misma instancia podria estar referenciada desde quichicientos
>>>> atributos, en michicientas clases. Cual seria el resultado que esperarias
>>>> entonces en tu caso de uso?
>>>>
>>>>  Algun "workaround"?
>>>>
>>>>  Angel "Java" Lopez
>>>> @ajlopez
>>>>
>>>>
>>>> 2014-04-22 15:05 GMT-03:00 Emiliano Reynares <
>>>> reynares.emiliano en gmail.com>:
>>>>
>>>>> Seguramente con un ejemplo se entienda mejor mi consulta:
>>>>>
>>>>>  class A():
>>>>>     pass
>>>>>
>>>>>  class B():
>>>>>     foo = A()
>>>>>
>>>>>  Dado esta estructura de clases, quisiera conocer desde un método de
>>>>> la instancia 'foo' el nombre de la clase que la tiene como atributo (que en
>>>>> este caso sería B). Alguna sugerencia?
>>>>>
>>>>
>>>> Podés hacer alguna chanchada ...
>>>>
>>>> Por ejemplo, podrías usar el módulo traceback para poder inspeccionar
>>>> el frame "superior" en el stack y eso te diría, cuando instanciás A, que
>>>> estas en B, y A.__init__ podría guardar esa data en alguna parte.
>>>>
>>>> Ejemplo:
>>>>
>>>> >>> import traceback
>>>> >>> help(traceback)
>>>>
>>>> >>> traceback.print_stack()
>>>>   File "<stdin>", line 1, in <module>
>>>> >>> class A:
>>>> ...     def __init__(self):
>>>> ...         traceback.print_stack()
>>>> ...
>>>> >>> class B:
>>>> ...     a = A()
>>>> ...
>>>>   File "<stdin>", line 1, in <module>
>>>>   File "<stdin>", line 2, in B
>>>>   File "<stdin>", line 3, in __init__
>>>>
>>>>
>>>> Asi que algo usando eso y el módulo inspect probablemente puedas hacer
>>>> eso. Igual... PORQUEEEEEEEEE? ;-)
>>>>
>>>> _______________________________________________
>>>> 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
>>>
>>
>>
>>
>> --
>> Ariel Gerardo Ríos
>> linkedin <http://www.linkedin.com/pub/ariel-gerardo-rios/33/158/227> | *blog
>> <http://www.ariel17.com.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
>>
>
>
>
> --
> Emiliano Reynares
>
> _______________________________________________
> 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
>



-- 
Ariel Gerardo Ríos
linkedin <http://www.linkedin.com/pub/ariel-gerardo-rios/33/158/227> | *blog
<http://www.ariel17.com.ar>*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20140422/77c51e1e/attachment.html>


More information about the pyar mailing list