jueves, 6 de junio de 2013

Atributos en pyBta. (Parte 1)



A partir de pyBta 0.2, la biblioteca empezó a ofrecer un modo sencillo de leer, o escribir, sobre los datos de los elementos que componen la biblioteca. Por ejemplo, si queremos cambiar la posición de un botón, se podrán usar una de estas tres formas:



        self.x=50



Cambia la posición horizontal del botón.



         self.y=100



Cambia la posición vertical del botón.



        self.posicion=50,100



Cambia la posición horizontal y vertical del botón conjuntamente.



Esta forma, da la sensación de estar accediendo a un dato del botón directamente, pero en realidad, no es así.



Normalmente los atributos de una clase son accesible desde el exterior mediante funciones setter (Cambian el valor de un atributo) y funciones getter (Leen el valor de un atributo) Por ejemplo, si estamos generando un programa que contiene un botón y queremos cambiar el ancho del mismo, lo normal sería usar este tipo de funciones, más o menos, de este modo(El modo cambiará según el lenguaje usado)



         boton.set_width(120)



Como se ve, la función setter sirve para cambiar el atributo de un objeto, en este caso el ancho del botón. La función getter se suele ver en esta forma:



         boton.get_width()



Este tipo de función hace retornar el valor actual del atributo deseado, en este caso el ancho del botón.



Cuando empecé con esta idea, yo intentaba usar una sola función que me permitiera, tanto acceder, como cambiar el valor de una propiedad para un elemento. Estas funciones llevaban esta forma:



         def valor_nombre(self,valor=None):

               if valor!=None:

                      self.__nombre=valor

               return self.__nombre



Si se llamaba a la función enviándola un valor distinto de None, esta aplicaba el valor recibido al atributo deseado y al final lo retornaba a la zona del código donde se había producido la llamada.

Si se llamaba a la función sin ningún valor, esta pasaba de la zona donde se producía

la asignación del valor al atributo y retornaba directamente el valor actual del atributo al código que realizo la llamada.



Esto fue ligeramente cambiado para la siguiente versión de la biblioteca. Para la segunda versión, PyBta hace uso de la función, property, para facilitar el acceso a los atributos que componen un objeto, creando así, una interfaz entre objeto y usuario mucho mas sencilla y amena de usar.



Lo que hace la función property, es agrupar el trabajo de las funciones setter y getter en un solo atributo. Esto se hace así:

         def set_width(self,width):
                 self.__width=width


          
         def get_width(self):

                 return self.__width()



width=property(fset=set_width,fget=get_width)


La función property recibe dos parámetros. El primero sirve para enlazar la función, set_width, como función setter, para el atributo width. El segundo parámetro, hace lo mismo que el primero, pero enlazando la función recibida como función getter para el atributo width.





En realidad, yo no uso exactamente el método que hasta ahora estoy contando. A partir de la segunda versión de la biblioteca, empecé a usar una forma híbrida entre esta que acabo de explicar y el modo que usaba en la primera versión. La idea queda así:



         def __valor_visible__(self,valor=None):

                 if valor!=None:

                         self.__visible=valor

                return self.__visible

        visible=property(fget=__valor_visible__, fset=__valor_visible__)



Como se puede observar, sigo usando el modo de la primera versión. Solo que al final, transformo la función a propiedad para facilitar su acceso.



De esta forma se puede cambiar el valor de un atributo, en este caso la visibilidad, usando este modo:



        elemento.visible=False



Si lo que se desea es preguntar por el estado actual de una propiedad, se usará este modo:



        if elemento.visible:



En la próxima entrada, hablaré sobre como se agrupan los atributos dentro de los elementos. Por ahora, diré que pyBta posee un grupo de atributos que son generales a casi todos sus elementos y después un grupo de atributos que son propios del módulo de controles y otro grupo propio para el módulo de escenas.

Safe Creative #1306065233506

No hay comentarios:

Publicar un comentario