[python] Objetos comparten atributo

Iniciado por $francisco, Abril 07, 2016, 05:35:34 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 07, 2016, 05:35:34 PM Ultima modificación: Abril 09, 2016, 12:45:13 PM por Expermicid
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
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
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?

Abril 07, 2016, 11:35:50 PM #1 Ultima modificación: Abril 09, 2016, 12:45:35 PM por Expermicid
En el primer caso buffer pertenece a la clase, no al metodo
Ni necesitas instanciar un objeto para acceder a buffer:
Código: text
>>> class a:
...     b=1
...
>>> a.b
1
>>> a.b=2
>>> a
<class __main__.a at 0x7f4e1e9d24c8>
>>> a.b
2



You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login
You are not allowed to view links. You are not allowed to view links. Register or Login or You are not allowed to view links. Register or Login

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