[Python-es] Limitar asignacion a miembro de clase

Anler Hernandez Peral anler86 en gmail.com
Mar Ago 16 18:53:40 CEST 2011


Creo que la solución de Chema Cortes no es necesaria ya que según por lo que
pones estás tratando de acceder al atributo desde una "instancia" de la
clase que encapsula lo que sería un descriptor:

c = subclase
c.miembro.métodos_clasebase(xxx)

No obstante si estoy yo equivocado, y la asignación la quieres "sobrecargar"
a la clase en sí, tendrías que implementar lo que dice Chema Cortes ya que
las clases no son más que instancias de la clase "type"
--
anler


2011/8/16 Chema Cortes <pych3m4 en gmail.com>

> 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
> _______________________________________________
> Python-es mailing list
> Python-es en python.org
> http://mail.python.org/mailman/listinfo/python-es
> FAQ: http://python-es-faq.wikidot.com/
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20110816/77bb5ccc/attachment.html>


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