Re: [Python-es] Limitar asignacion a miembro de clase
Gracias por tu respuesta, tendré en cuenta para la próxima en crear otro hilo. Esa búsqueda que mencionas la he hecho junto con muchas mas, y probé lo que me indicas pero no es lo que busco, seguiré buscando y probando. -- Alvaro Manrique Programador PIN: 221C390B Skype: alvaro_manrique -- On 09/11/11 11:03, Jose Caballero wrote: Tambien quiero aprovechar para realizarles otra pregunta, la cual es... Existe alguna manera de obtener el nombre de la instancia de una clase desde la misma?? Es decir, tratando de hacer uso de la introspección de python, como pudiera hacer algo como self.instancia, self.nombreinstancia?? Recomendacion: siempre abrir un hilo nuevo para hacer una pregunta diferente. Si buscas en google python introspection puedes encontrar muchas cosas en el primer link. Lo que yo hago (y creo que no es la mejor forma, puede que las haya mejores) es objeto.__class__.__name__ si estas dentro de la propia clase, entonces objeto se cambia por self. Suerte, Jose P.S. como siempre, perdon por la ausencia de tildes cuando trabajo con teclado anglosajon. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
Tambien quiero aprovechar para realizarles otra pregunta, la cual es... Existe alguna manera de obtener el nombre de la instancia de una clase desde la misma?? Es decir, tratando de hacer uso de la introspección de python, como pudiera hacer algo como self.instancia, self.nombreinstancia?? Recomendacion: siempre abrir un hilo nuevo para hacer una pregunta diferente. Si buscas en google python introspection puedes encontrar muchas cosas en el primer link. Lo que yo hago (y creo que no es la mejor forma, puede que las haya mejores) es objeto.__class__.__name__ si estas dentro de la propia clase, entonces objeto se cambia por self. Suerte, Jose P.S. como siempre, perdon por la ausencia de tildes cuando trabajo con teclado anglosajon. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
2011/11/9 Jose Caballero jcaballero@gmail.com Existe alguna manera de obtener el nombre de la instancia de una clase desde la misma?? Es decir, tratando de hacer uso de la introspección de python, como pudiera haceralgo como self.instancia, self.nombreinstancia?? a que te refieres con nombre de instancia? si te refieres a la clase, podrias sacarlo mediante type(objeto) aunque incluye el nombre del paquete, pero eso tiene sentido ya que podria confundirse en el caso de que dos clases vinieran de paquetes diferentes. En cualquier caso, una instancia no tiene nombre como tal. Un saludo ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
Muchas gracias por sus respuestas, de verdad muy enriquecedoras, voy a estudiar y a evaluar cada una de las respuestas, no lo habia hecho antes ya que la empresa a la que trabajo (igual como programador) me ha absorbido todo mi tiempo y esto es un desarrollo propio que llevo por mi cuenta. Tambien quiero aprovechar para realizarles otra pregunta, la cual es... Existe alguna manera de obtener el nombre de la instancia de una clase desde la misma?? Es decir, tratando de hacer uso de la introspección de python, como pudiera hacer algo como self.instancia, self.nombreinstancia?? -- Alvaro Manrique Programador PIN: 221C390B Skype: alvaro_manrique Venezuela -- On 16/08/11 12:23, Anler Hernandez Peral wrote: 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 pych...@gmail.com mailto:pych...@gmail.com El día 16 de agosto de 2011 05:54, Alvaro Manrique sanreikaj.fo...@gmail.com mailto:sanreikaj.fo...@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@python.org mailto:Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
Hola Alvaro, La mejor solución para lo que quieres hacer es que hacer que tu clase clasebase sea un descriptor, te dejo unos enlaces por si no sabes que es: http://users.rcn.com/python/download/Descriptor.htm http://martyalchin.com/2007/nov/23/python-descriptors-part-1-of-2/ Los descriptores es un tema avanzado en Python y solo están disponibles para clases new style, te dejo un ejemplo para que lo veas en acción: http://pastebin.com/T5sqTCHr -- anler 2011/8/16 Alvaro Manrique sanreikaj.fo...@gmail.com Buenas Noches; Quisiera pedirles una pequeña ayuda con una duda que tengo, la expongo de la siguiente manera: Tengo una clase (subclase) donde tiene unos miembros, los cuales son instancias de una clase base, esta clase base tiene métodos para asignar valor y obtenerlos. La subclase esta diseñada de la siguiente manera: class subclase: miembro = clasebase(parámetros) Cuando implemento la subclase funciona de maravilla llamando los métodos de la clase base. c = subclase c.miembro.métodos_clasebase(**xxx) Hasta aquí todo bien, es el comportamiento esperado para el desarrollo que llevo, el punto o mi duda esta en que puedo hacer lo siguiente: c.miembro = cualquier_valor Al hacer esto el miembro deja de ser una instancia de la clase base y esto me ocasiona errores, quisiera poder evitar esta asignación a este miembro, hay alguna manera de hacerlo? Agradezco de antemano a cualquier ayuda u orientación que me puedan brindar. -- -- Alvaro Manrique Programador PIN: 221C390B Skype: alvaro_manrique -- __**_ Python-es mailing list Python-es@python.org http://mail.python.org/**mailman/listinfo/python-eshttp://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.**com/http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
El día 16 de agosto de 2011 05:54, Alvaro Manrique sanreikaj.fo...@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@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
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 pych...@gmail.com El día 16 de agosto de 2011 05:54, Alvaro Manrique sanreikaj.fo...@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@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] Limitar asignacion a miembro de clase
Buenas Noches; Quisiera pedirles una pequeña ayuda con una duda que tengo, la expongo de la siguiente manera: Tengo una clase (subclase) donde tiene unos miembros, los cuales son instancias de una clase base, esta clase base tiene métodos para asignar valor y obtenerlos. La subclase esta diseñada de la siguiente manera: class subclase: miembro = clasebase(parámetros) Cuando implemento la subclase funciona de maravilla llamando los métodos de la clase base. c = subclase c.miembro.métodos_clasebase(xxx) Hasta aquí todo bien, es el comportamiento esperado para el desarrollo que llevo, el punto o mi duda esta en que puedo hacer lo siguiente: c.miembro = cualquier_valor Al hacer esto el miembro deja de ser una instancia de la clase base y esto me ocasiona errores, quisiera poder evitar esta asignación a este miembro, hay alguna manera de hacerlo? Agradezco de antemano a cualquier ayuda u orientación que me puedan brindar. -- -- Alvaro Manrique Programador PIN: 221C390B Skype: alvaro_manrique -- ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
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. Muchas gracias. -- Alvaro Manrique Programador PIN: 221C390B Skype: alvaro_manrique -- On 15/08/11 22:28, Jose Caballero wrote: quisiera poder evitar esta asignación a este miembro, hay alguna manera de hacerlo? Ideas rápidas: - property() - __setattr__() ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] Limitar asignacion a miembro de clase
El día 16 de agosto de 2011 04:43, Alvaro Manrique sanreikaj.fo...@gmail.com escribió: Buenas Noches; Quisiera pedirles una pequeña ayuda con una duda que tengo, la expongo de la siguiente manera: Tengo una clase (subclase) donde tiene unos miembros, los cuales son instancias de una clase base, esta clase base tiene métodos para asignar valor y obtenerlos. La subclase esta diseñada de la siguiente manera: class subclase: miembro = clasebase(parámetros) con eso estas usando agregación, no herencia Mira a ver si lo que quieres hacer es: class Subclase(clasebase): pass objeto = Subclase(parametros) objeto.metodos_clasebase(xxx) Y ya a partir de ahi todo lo relacionado con la herencia y todas esas cosas. Saludos: Javi ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/