Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: $francisco en Abril 07, 2016, 05:35:34 PM

Título: [python] Objetos comparten atributo
Publicado por: $francisco en Abril 07, 2016, 05:35:34 PM
Muy buenas de nuevo, la verdad no sabia que titulo poner pero es así en un caso que no se el porque, tan solo creo una clase y pongo un atributo que contiene una lista y al crear dos objetos de esa clase y actualizar la lista el otro objeto también cambia el atributo.

Código (python) [Seleccionar]
class estructura:
    _buffer = []
    def __init__(self):
        self.id = 0

    def set_buffer(self,data):
        self._buffer.append(data)

    def get_buffer(self):
        return self._buffer

q = estructura()
q2 = estructura()

q.set_buffer('datos')

print q.get_buffer()
print q2.get_buffer()


Simplemente es un ejemplo y si lo ejecutan los dos objetos tienen el atributo "_buffer" con el mismo valor y esto no deberia pasar al cambiar el valor de un atributo de un objeto no deberia afectar al otro pero tambien comprobé que esto cambia si hago lo siguiente.

Código (python) [Seleccionar]
class estructura:
    def __init__(self):
        self.id = 0
        self._buffer = []

    def set_buffer(self,data):
        self._buffer.append(data)

    def get_buffer(self):
        return self._buffer

q = estructura()
q2 = estructura()

q.set_buffer('datos')

print q.get_buffer()
print q2.get_buffer()


Si pongo el atributo "_buffer" dentro de el metodo "__init__" no comparte este atributo y tampoco pasa si el buffer es simplemente un "string" solo pasa si contiene una lista, tupla o diccionario ¿alguien sabe a que se debe?
Título: Re:[python] Objetos comparten atributo
Publicado por: seth en Abril 07, 2016, 11:35:50 PM
En el primer caso buffer pertenece a la clase, no al metodo
Ni necesitas instanciar un objeto para acceder a buffer:
>>> class a:
...     b=1
...
>>> a.b
1
>>> a.b=2
>>> a
<class __main__.a at 0x7f4e1e9d24c8>
>>> a.b
2



http://stackoverflow.com/questions/68645/static-class-variables-in-python
https://docs.python.org/2/tutorial/classes.html#class-objects

edit: yo siempre seteo los atributos en el init, aunque ahora me agarro la duda y no se si es la mejor practica