| You are here: Inicio > Inmersión en Python > Objetos y orientación a objetos > Métodos especiales avanzados | << >> | ||||
Inmersión en PythonPython de novato a experto |
|||||
Python tiene más métodos especiales aparte de __getitem__ y __setitem__. Algunos de ellos le permiten emular funcionalidad que puede que aún ni conozca.
Este ejemplo muestra algunos de los otros métodos especiales de UserDict.
def __repr__(self): return repr(self.data)
def __cmp__(self, dict):
if isinstance(dict, UserDict):
return cmp(self.data, dict.data)
else:
return cmp(self.data, dict)
def __len__(self): return len(self.data)
def __delitem__(self, key): del self.data[key] 
| __repr__ es un método especial que se invoca cuando llamamos a repr(instancia). La función repr viene incorporada y devuelve una representación textual de un objeto. Funciona sobre cualquier objeto, no sólo instancias de clases. Ya está familiarizado con repr aunque no lo supiera. En la ventana interactiva, cuando escribe un nombre de variable y pulsa INTRO, Python usa repr para mostrar su valor. Cree un diccionario d con algunos datos y entonces haga print repr(d) para comprobarlo usted mismo. | |
| __cmp__ se invoca cuando compara instancias de clases. En general, puede comparar dos objetos cualquiera de Python usando ==, no sólo instancias de clases. Hay reglas que definen cuándo se consideran iguales dos tipos de datos incorporados; por ejemplo, los diccionarios son iguales cuando tienen todas las mismas claves y valores, y las cadenas son iguales cuando tienen la misma longitud y contienen la misma secuencia de caracteres. Para instancias de clases, podemos definir el método __cmp__ y programar la lógica de la comparación nosotros mismos, y entonces puede usar == para comparar instancias de sus clases y Python invocará a su método especial __cmp__ por usted. | |
| __len__ se invoca cuando llama a len(instancia). La función incorporada len devuelve la longitud de un objeto. Funciona sobre cualquier objeto del que se pueda pensar razonablemente que tiene longitud. La len de una cadena es su número de caracteres; la len de un diccionario es su número de claves; la len de una lista o tupla es su número de elementos. Para instancias de clases; defina el método __len__ y programe usted mismo el cálculo de la longitud, y luego llame a len(instancia) para que Python invoque a su método especial __len__. | |
| __delitem__ se invoca cuando llama a del instancia[clave], que como puede que recuerde es la manera de eliminar elementos individuales de un diccionario.. Cuando use del sobre una instancia de clase, Python invocará al método especial __delitem__. |
| En Java, determinamos si dos variables de cadena referencian la misma posición física de memoria usando str1 == str2. A esto se le denomina identidad de objetos, y en Python se escribe así: str1 is str2. Para comparar valores de cadenas en Java, usaríamosstr1.equals(str2); en Python, usaríamos str1 == str2. Los programadores de Java a los que se les haya enseñado a creer que el mundo es un lugar mejor porque == en Java compara la identidad en lugar del valor pueden tener dificultades ajustándose a la falta de este tipo de “gotchas” en Python. | |
A estas alturas, puede estar pensando, “Todo este trabajo sólo para hacer algo en una clase que podría hacer con un tipo de datos incorporado”. Y es cierto que la vida sería más fácil (e innecesaria toda la clase UserDict) si pudiéramos heredar de tipos de datos incorporados como un diccionario. Pero incluso aunque pudiera, los métodos especiales seguirían siendo útiles, porque se pueden usar en cualquier clase, no sólo en las que envuelven a otras como UserDict.
Los métodos especiales implican que cualquier clase puede almacenar pares clave/valor como un diccionario. Cualquier clase puede actuar como una secuencia, simplemente definiendo el método __getitem__. Cualquier clase que defina el método __cmp__ puede compararse con ==. Y si su clase representa algo que tenga una longitud, no defina un método GetLength; defina el método __len__ y use len(instancia).
| Mientras que otros lenguajes orientados a objeto sólo le permitirán definir el modelo físico de un objeto (“este objeto tiene un método GetLength”), los métodos especiales de Python como __len__ le permiten definir el modelo lógico de un objeto (“este objeto tiene una longitud”). | |
Python tiene muchos otros métodos especiales. Hay todo un conjunto de ellos para hacer que las clases actúen como números, permitiéndole sumar, sustraer y otras operaciones aritméticas sobre instancias de clases (el ejemplo canónico es la clase que representa a los números complejos, con componentes real e imaginario). El método __call__ permite que una clase actúe como una función, permitiéndole invocar directamente a una instancia de la clase. Y hay otros métodos especiales que permiten a las clases tener atributos de datos de sólo lectura o sólo escritura; hablaremos más sobre ellos en otros capítulos.
<< Métodos de clase especiales |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
Presentación de los atributos de clase >> |