Foros del Web » Programando para Internet » Python »

Problema: properties y clases que extienden de object

Estas en el tema de Problema: properties y clases que extienden de object en el foro de Python en Foros del Web. Hola a todos. Tengo un problema con problema con propiedades DE SOLO LECTURA (solo método get) en python. Las propiedades son de una clase que ...
  #1 (permalink)  
Antiguo 26/02/2015, 08:59
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 6 años, 7 meses
Puntos: 3
Problema: properties y clases que extienden de object

Hola a todos. Tengo un problema con problema con propiedades DE SOLO LECTURA (solo método get) en python.

Las propiedades son de una clase que extiende de list y sobrecarga sus métodos __iadd__ (+=) e __isub__ (-=).

Mi problema es que puedo usar el operador += con esa propiedad de solo lectura solo si la clase no extiende de object. Adjunto un ejemplo:

Código:
class A(list):
	def __iadd__(self, other):
        self.append(other)
        return self
    
    
    def __isub__(self, other):
        self.remove(other)
        return self
		
		
class B():
	def __init__(self):
		self.__a = A()
		

	def __get_a(self):
		return self.__a
		
		
	propA = property(__get_a)
	
	
class C(object):
	def __init__(self):
		self.__a = A()
		

	def __get_a(self):
		return self.__a
		
		
	propA = property(__get_a)
	
	

if __name__=="__main__":
	b = B()
	c = C()
	b.propA += 20			#BIEN
	b.propA.append(20)		#BIEN
	c.propA += 20 			#¡¡¡ERROR!!!
	c.propA.append(20)		#BIEN
¿Por qué ocurre esto? ¿Significa que en Python 3.x esto no se puede hacer?
¿Qué puedo hacer para poder usar += con propiedades de solo lectura en clases que extiendan de object?

Saludos gracias.
  #2 (permalink)  
Antiguo 26/02/2015, 09:44
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 15 años, 7 meses
Puntos: 1360
Respuesta: Problema: properties y clases que extienden de object

Cita:
Iniciado por SARGE553413 Ver Mensaje
¿Por qué ocurre esto?
Porque estas mezclando old-style y new-style classes. Las propiedades no funcionan en old style classes, solo parecen funcionar. http://bytes.com/topic/python/answer...-actually-work

De hecho estas mezclando conceptos como mutabilidad y properties lo cual hace aun mas difícil detectar tu problema.

Cita:
Iniciado por SARGE553413 Ver Mensaje
¿Significa que en Python 3.x esto no se puede hacer?
De hecho en python 3 ya no existen old-style classes.

Cita:
Iniciado por SARGE553413 Ver Mensaje
¿Qué puedo hacer para poder usar += con propiedades de solo lectura en clases que extiendan de object?
¿Quieres modificar un atributo de solo lectura?
Si es así, porque lo haces solo lectura en primer lugar?
  #3 (permalink)  
Antiguo 26/02/2015, 10:36
 
Fecha de Ingreso: febrero-2014
Mensajes: 55
Antigüedad: 6 años, 7 meses
Puntos: 3
Respuesta: Problema: properties y clases que extienden de object

No busco modificar un atributo de solo lectura lo que quiero es:
1 - Tener un atributo de tipo lista en una clase.

2 - Que sea posible insertar o eliminar datos de esa lista, pero que no se pueda asignar una nueva lista a esa variable.

Por ejemplo, si simplemente pongo en una clase A una lista 'list' pública de solo lectura (es decir property con solo get), se podría hacer:
Código:
a = A()
a.list.append(20)                  #Esto es lo que quiero que se pueda hacer.
a.list = [i for i in range(10)]  #Esto es lo que no quiero que se pueda hacer.
Por otro lado, no veo por qué estoy mezclando old-style y new-style classes, si estoy en python 2.7 y decido que voy a usar new-style classes todas extienden de object, yno veo que hay mezcla de old-style y new-style.
Si quiero que sean old-style, no extienden de object y lo mismo.

Con respecto a mezclar mutabilidad y properties, no se a que te refieres exactamente, lo mismo que quiero hacer se podría hacer con un getter, lo quiero hacer con una property por "sintax sugar". Pero desde luego sabiendo que una propiedad puede ser de solo lectura o de lectura y escritura, el concepto de mutabilidad está bastante relacionado con las properties entiendo.

Respecto a python 3, sé que no existen old-style classes pero precisamente es en python 3 donde las propiedades deberían funcionar 100%, en ese caso lo que quiero hacer se debería poder hacer en python 3 incluso mejor que en python 2.x, pero esa es una de las cosas que pregunto.

Última edición por SARGE553413; 26/02/2015 a las 10:50

Etiquetas: clases, object, properties
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:01.