[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