help_outline
Ayudanos!
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

[python] Objetos comparten atributo

  • 1 Respuestas
  • 838 Vistas

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

Desconectado $francisco

  • *
  • Underc0der
  • Mensajes: 191
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: hackloper
« 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
  1. class estructura:
  2.     _buffer = []
  3.     def __init__(self):
  4.         self.id = 0
  5.  
  6.     def set_buffer(self,data):
  7.         self._buffer.append(data)
  8.  
  9.     def get_buffer(self):
  10.         return self._buffer
  11.  
  12. q = estructura()
  13. q2 = estructura()
  14.  
  15. q.set_buffer('datos')
  16.  
  17. print q.get_buffer()
  18. 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
  1. class estructura:
  2.     def __init__(self):
  3.         self.id = 0
  4.         self._buffer = []
  5.  
  6.     def set_buffer(self,data):
  7.         self._buffer.append(data)
  8.  
  9.     def get_buffer(self):
  10.         return self._buffer
  11.  
  12. q = estructura()
  13. q2 = estructura()
  14.  
  15. q.set_buffer('datos')
  16.  
  17. print q.get_buffer()
  18. 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?
« Última modificación: Abril 09, 2016, 12:45:13 pm por Expermicid »

Desconectado seth

  • *
  • Underc0der
  • Mensajes: 264
  • Actividad:
    0%
  • Reputación 2
    • Ver Perfil
« Respuesta #1 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:
Código: [Seleccionar]
>>> 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
« Última modificación: Abril 09, 2016, 12:45:35 pm por Expermicid »

 

¿Te gustó el post? COMPARTILO!



[DUDA] Aprendo Python y tengo una duda

Iniciado por EXUMER

Respuestas: 2
Vistas: 387
Último mensaje Noviembre 26, 2018, 01:27:32 pm
por <<Pyromaniac>>
[SOLUCIONADO] Correr paso a paso un Script de Python

Iniciado por Olger346

Respuestas: 2
Vistas: 755
Último mensaje Febrero 11, 2018, 10:36:44 am
por Olger346
[SOLUCIONADO] [Python] Error: "Expected an indented block"

Iniciado por Banfek

Respuestas: 3
Vistas: 1972
Último mensaje Abril 01, 2015, 05:58:13 pm
por Banfek
[SOLUCIONADO] ¿Algún curso, taller o libro sobre inteligencia artificial Python?

Iniciado por dolphin

Respuestas: 1
Vistas: 986
Último mensaje Septiembre 10, 2016, 03:39:20 pm
por blackdrake
[Python] ¿Alguna libreria para recuperar archivos eliminados de la papelera?

Iniciado por $francisco

Respuestas: 2
Vistas: 1562
Último mensaje Noviembre 05, 2018, 06:43:15 am
por alexcv