[Python-es] Limitar asignacion a miembro de clase

Chema Cortes pych3m4 en gmail.com
Mar Ago 16 18:35:07 CEST 2011


El día 16 de agosto de 2011 05:54, Alvaro Manrique
<sanreikaj.foros en gmail.com> escribió:
> Gracias por la respuesta, voy a ver como lo puedo manejar en base a tu
> respuesta y lo expongo aqui,
> sin embargo para quien pueda apoyarme con mas información, esta clase esta
> diseñada de esta manera,
> sencilla y no debe tener metodos, ya que esta es una de las capas para la
> abstractación de de la base de datos,
> que forma parte de la capa de negocio del sistema en desarrollo.
>
> Esta clase corresponde a una tabla en la db y cada miembro es un campo, de
> alli es el porque de que cada miembro
> es una instancia de una clase base.

Tal como lo comentas, trabajando directamente con los atributos de
clase NO vas a poder evitar que una asignación "machaque" el atributo
de clase. Aunque es algo complicado, he intentado explicarlo este
motivo en los artículos sobre "descriptores" que estoy escribiendo en
mi blog:

  http://ch3m4.org/blog/tag/descriptor/

Para hacer lo que pretendes debes subir un nivel de abstracción, o lo
que es lo mismo, debes trabajar desde una "metaclase".

Rápidamente, sería algo así:

class Meta(type):
	def __new__(meta, name, bases, dict):
		def setattr(cls, name, value):
			pass
		dict["__setattr__"]=setattr
		return type.__new__(meta, name, bases, dict)

class subclase:
		__metaclass__ = Meta
		miembro = clasebase(parámetros)


Si no quieres ir añadiendo el atributo __metaclass__ a cada clase,
también puedes poner la metaclase como variable global al módulo donde
estés definiendo las clases:

class __metaclass__(type):
	def __new__(meta, name, bases, dict):
		def setattr(cls, name, value):
			pass
		dict["__setattr__"]=setattr
		return type.__new__(meta, name, bases, dict)

class subclase:
		miembro = clasebase(parámetros)


Esta solución ignora la reasignación de atributos de clase. Lo suyo
sería lanzar alguna excepción.

-- 
Hyperreals *R: http://ch3m4.org/blog
Quarks, bits y otras criaturas infinitesimales


Más información sobre la lista de distribución Python-es