[pyar] Consulta sonsa

fisa fisadev en gmail.com
Mar Abr 3 13:00:37 ART 2012


El día 2 de abril de 2012 23:18, Martin Cerdeira
<martincerdeira en gmail.com> escribió:
> On Sun, Apr 1, 2012 at 1:41 AM, Alejandro J. Cura <alecu en protocultura.net>
> wrote:
>>
>> On Sat, Mar 31, 2012 at 18:03, Martin Cerdeira <martincerdeira en gmail.com>
>> wrote:
>> > Digamos, quiero saber si la clase tiene el atributo, independientemente
>> > de
>> > si depende o no de la instancia... No sé si se puede hacer eso.
>>
>> Si lo tiene la clase, lo tiene la clase.
>> Si lo tiene la instancia, lo tiene la instancia.
>>
>> La única manera de saber si lo tiene *alguna* de las instancias de la
>> clase, es guardar tooooodas las instancias y ver si alguna lo tiene:
>>
>> >>> class F:
>> ...     pass
>> ...
>> >>> f1=F()
>> >>> f2=F()
>> >>> f3=F()
>> >>> f3.bar = "baz"
>> >>> any("bar" in vars(i) for i in [f1, f2, f3])
>> True
>>
>>
>> Pero me parece que si necesitás hacer eso, es que hay algo feo en el
>> diseño de tu código.
>> Porqué no contás un poco más que querés hacer?
>
>
> En realidad, no quiero hacer nada. Fue algo que vi haciendo pruebas
> relativas a otra cosa (estaba jugando con metaclases) y, me pregunté si se
> podía hacer.
>
> Saludos y gracias!
> -------------------------------------
> Martín Cerdeira - Software Developer
> At the end of the day, ship the fucking thing! It’s great to rewrite your
> code and make it cleaner and by the third time it’ll actually be pretty. But
> that’s not the point—you’re not here to write code; you’re here to ship
> products. - Jamie Zawinski
>
>
>
> _______________________________________________
> 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

La cuestión de fondo es que en realidad en python las clases no
definen los atributos que van a tener las instancias, como pasa en la
mayoría de los otros lenguajes.
La clase solo define el comportamiento (métodos de instancia) y
después lo que sea referido a la clase en sí, pero no define qué
atributos va a tener una instancia de ella.

En python los atributos son algo propio de la instancia, y por eso
varias instancias de una misma clase pueden tener atributos diferentes
entre sí. En el __init__ lo que se hace es *agregarle* los atributos
que queremos a la instancia recién creada (que recibís en el parámetro
self).
El __init__ no "define" los atributos que tienen todas instancias de
una clase, sino que "agrega" atributos a una instancia específica (la
que recién se creó). Pero esa instancia ya fue creada, ya es una
instancia de la clase *antes* de que le agreguemos todos los
atributos, porque los atributos no son algo definido por su clase.

Por eso funciona esto:

import random

class Cosa:
    def __init__(self):
        tipo = random.randint(0, 3)
        if tipo == 1:
            self.nombre = ''
            self.edad = 0
        elif tipo == 2:
            self.ancho = 0
            self.alto = 0

(notar que el tipo puede ser 0, en cuyo caso no le agregamos atributos
a la instancia)

Fijate que diferentes instancias de Cosa tendrían diferentes atributos
(incluso ninguno extra), porque el __init__ de Cosa agrega atributos
diferentes a self aleatoriamente.

Por eso, porque los atributos de las instancias *no* están definidos
en la clase, es que no podés preguntarle a la clase qué atributos van
a tener sus instancias.

Saludos!

-- 
fisa  -  Juan Pedro Fisanotti



More information about the pyar mailing list