[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: php
>>> class a:
...     b=1
...
>>> a.b
1
>>> a.b=2
>>> a
<class __main__.a at 0x7f4e1e9d24c8>
>>> a.b
2



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

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