LA FUNCIÓN ISINSTANCE()

 

PAISAJE TÍPICO DE LAS MEDIANÍAS ALTAS DEL OESTE DE TENERIFE, PROPIA DE LOS VALLES DE SANTIAGO DEL TEIDE, TÁGARA BAJO Y COMARCA DE ISORA.


      En Python contamos con la función integrada isinstance() que nos permite saber, primero, si el objeto que le pasamos como argumento es o no una instancia de clase, (recordemos que cuando un método integrado de Python o cualquier otro método derivado de las clases de tipo de dato, como los métodos de las strings, los más característicos para el caso, los métodos de las listas o los métodos de los diccionarios, por ejemplo, comienzan con el prefijo is-, "es", en castellano,  lo que hacen es formular la pregunta "¿Es - esto?", cuya respuesta sólo puede ser un booleano: o True/1 o False/0), y en el caso de serlo, en segundo lugar, nos permite también saber dentro de qué clase ha sido instanciado. Obviamente, esto nos viene de perillas tanto para trabajar con herencias (así sabremos si tal o cuál objeto fue instanciado en la clase padre o superclase o, por el contrario, si lo fue en alguna de las clases hijas.), como para trabajar con clases y subclases (clases anidadas).



Este nuevo método que presentamos lleva dos parámetros en atención a lo antedicho: el primero, es la referencia al objeto; y el segundo, el nombre de la clase (el classname) de la que creamos que haya sido instanciado.


      DE LO QUE LLEVAMOS DICHO HASTA EL MOMENTO, SE DEDUCE UN DETALLE: SI NUESTRO CÓDIGO ES RELATIVAMENTE SIMPLE, CON UNA O MUY POQUITAS CLASES, O NO HEREDAMOS, O NO USAMOS UN ESQUEMA DE CLASES ANIDADAS, O USAMOS UNA HERENCIA SIMPLE, EN TODOS LOS CASOS, CON POCOS OBJETOS O, POR LO MENOS, UNA CANTIDAD EXCESIVA DE ELLOS, NO TIENE SENTIDO USAR EL MÉTODO.



      GUAU A TODOS. YA QUE VOLVIMOS A INSISTIR ANTES EN LOS MÉTODOS DE TIPO BOOLEANO, COMO EL MISMO isinstance(), ESTO ES, AQUÉLLOS QUE COMIENZAN CON EL PREFIJO is- Y QUE DEVUELVEN COMO RESPUESTA True O False, SÓLO COMO APUNTE, SU FUNCIÓN PRIMORDIAL ES LA DE SERVIR DE PIVOTE (UN CONDICIONAL if O while) PARA BIFURCAR UN CÓDIGO: SI ES True, HACEMOS ESTO Y SI ES False, HACEMOS ESTO OTRO. PERO TAMBIÉN SIRVEN AL PROGRAMADOR PARA SABER SI UNA string, UNA CADENA DE TEXTO, POR EJEMPLO, ESTÁ FORMADA SÓLO POR DÍGITOS, SÓLO POR LETRAS, POR UNA COMBINACIÓN DE AMBOS, SI TIENE ESPACIOS EN BLANCO, ETC. SIN QUE ELLO TENGA RELEVANCIA EN EL CÓDIGO NI ESTABLEZCAMOS UNA BIFURCACIÓN/CONDICIÓN A PARTIR DE ELLO. SE TRATA SÓLO DE INFORMAR SI VAMOS A TENER ESTO O LO OTRO CUANDO SE EJECUTE UN SCRIPT O UNA PARTE DEL CÓDIGO, Y DECIDIR LUEGO QUÉ HACEMOS CON ELLO O SI NO HACEMOS NADA. POR ESO, CUANDO TENGAMOS UN PROGRAMA PERFECTAMENTE ACABADO Y PERFECTAMENTE OPERATIVO, PODEMOS OPTAR POR ELIMINAR ESTAS "PRUEBAS" Y ALIGERAR EL PESO DE NUESTRO CÓDIGO, O COMENTARLAS (#) PARA INFORMAR A OTROS PROGRAMADORES O, INCLUSO A NOSOTROS MISMOS TIEMPO DESPUÉS, CUANDO PROCEDAMOS A ACTUALIZAR NUESTRO CÓDIGO.

Es importante tener en cuenta que la función isinstance() se apoya en el MRO que hemos visto ya en apartados anteriores, para mantener la coherencia con el flujo de ejecución de los programas en Python: si Python utiliza el MRO para determinar o establecer a qué clase padre o superclase corresponde tal objeto instanciado en tal clase hija (o en otras clases hijas), distinguiendo así entre clases padres/ clases hijas y clases hermanas entre sí, es lógico que recurra al mismo esquema para determinar si un objeto es una instancia y, sobre todo, si ha sido instanciado en tal clase o en tal otra.
Vamos, pues, con un ejemplo de muestra.


En 1. instanciamos un objeto a de la superclase Planeta.
En 2. recurrimos a nuestra función isinstance() para saber si instanciamos al objeto a dentro de la clase Planeta. Obviamente, la respuesta es un True como la copa de un pino.
En 3. preguntamos si el objeto a fue instanciado en la clase hija Rocoso que ha extendido de la clase padre o superclase Planeta. Python, también obviamente, nos responde que no (False).
En 4. instanciamos un objeto b de la clase Órbita, que es hija de la superclase Planeta, a la vez que también lo es de las clases padre Rocoso y Gaseoso, siendo su estructura jerárquica la siguiente (lo que a su vez determinará la correspondiente MRO).


En 5. preguntamos si instanciamos al objeto b dentro de la clase Gaseoso. Nos devuelve True. ¿Por qué si sabemos que el objeto fue instanciado en la clase Órbita? Porque Gaseoso es una de las clases padre de Órbita y, en consecuencia, es como si también lo hubiéramos instanciado en él.
En 6. preguntamos si instanciamos al objeto b en la clase Habitable. Python nos dice que no (False). Si repasamos el esquema anterior comprobamos fácilmente que Habitable no aparece pues es una clase hija de Órbita (el objeto b heredaría las propiedades y métodos de Órbita, más las propiedades y métodos que hubiera heredado Órbita a su vez de su clase o de sus clases padre, pero el objeto b no fue instanciado en la clase Habitable).
En 7. preguntamos finalmente si instanciamos al objeto b dentro de la clase Planeta, nuestra superclase por excelencia en el esquema que tenemos arriba, y Python nos responde que sí, True, de acuerdo a la coherencia jerárquica y al MRO.



Hemos dicho con anterioridad que toda clase, sean heredadas o no, cuentan siempre con una superclase superior que en versiones anteriores de Python era necesario invocar y que ahora, en esta nueva versión 3 del programa, se ha elipsado de tal modo que ya no es necesario pasarla como argumento (aunque lo podemos hacer si queremos) en ninguna clase: la superclase object predefinida en Python (nótese que no se escribe en mayúsculas), y de la que todas las clases heredan los llamados métodos especiales. Veamos en el ejemplo siguiente cómo funciona también con la función isinstance().



Pero vayamos aún más adelante con esta función isinstance() y desvelemos alguna de sus sorpresas. Para ello, veamos qué nos cuenta el propio Python acerca de la función en sí cuando llamamos a la función integrada help() que nos conecta con la documentación incluida en el propio programa.


¡Anda! Si no sólo atiende a las clases donde comprobamos si el objeto que hayamos instanciado y que pasamos como primer argumento obligatorio lo ha sido en ella (True) o en otra (False) sino que, además, podemos comprobar si un objeto cualquiera pertenece a un tipo de dato o a otro... Bueno, sí, hay trampa: Los tipos de datos integrados en Python como list(), str(), set(), int(), etc. son, ya lo hemos dicho en varias ocasiones a lo largo de este manual, clases integradas. Veámoslo:


Por tanto, en realidad, la función isinstance() hace exactamente lo que habíamos dicho que hace: comparar la filiación entre un objeto (instancia) y una clase. Vamos a incluir un ejemplo:


Clarito, ¿verdad?

ARCO DE PIEDRA EN EL BARRANCO DE MASCA, MACIZO DE TENO, NOROESTE DE TENERIFE.




No hay comentarios:

Publicar un comentario