17 de mayo de 2016

30. Tipos: hemos estado trabajando con objetos.

Hemos estado trabajando con objetos y no nos hemos dado cuenta

En el apartado anterior, definimos una clase, y dentro de ella, dos objetos (clase pelotas y objetos pelota1 y pelota2). Una clase podríamos definirla como el tipo de objetos , como una entidad superior, un conjunto, que engloba los objetos individuales que puedo definir.
En la terminología que usaremos en Python, la clase, el tipo de objetos que estoy definiendo posee atributos y métodos.
  • Los atributos son características concretas, datos concretos, que poseerán nuestros objetos. En el ejemplo del tema anterior, un atributo de la pelota es su radio o su color.
  • Los métodos son las acciones que puedo realizar sobre ese objeto; en el ejemplo de las pelotas, inflarlas, pincharlas o botarlas.
Cuando hablemos de objetos, a veces nos referimos a la clase ("pelotas") y a veces a los objetos individuales (pelota1, pelota2) que pertenece a esa clase. Se dice que un objeto individual que pertenece a una clase es una instancia de una clase. Es decir, por ejemplo, pelota1 es una instancia de la clase pelotas.
Además
  • Los valores que tienen los atributos de una instancia en un momento dado, son su estado.
  • Los métodos definidos en una clase indicarán el comportamiento de ese objeto.
= = =
Vamos ahora a pensar en algo sencillo. Por ejemplo, defino una cadena en Python cadena = "Hola" ; sé que la cadena es una variable de tipo string (cadena). De hecho, si ejecuto la orden type obtengo str.
>>> cadena = "Hola mundo"
>>> print cadena
Hola mundo
>>> print type(cadena)
<type 'str'>
Y si necesito conocer algún atributos de esta cadena, puedo por ejemplo saber su longitud con la función len (len es una función pero devuelve un atributo). Y si quiero actuar sobre ella, por ejemplo cambiándola a mayúsculas, uso el método upper().
>>> print len(cadena)
10
>>> print cadena.upper()
HOLA MUNDO
Claramente, existe un paralelismo entre un tipo de dato definido en Python, como las cadenas, y los objetos. En realidad todos los tipos de datos en Python son clases y cada variable definida de un tipo no es más que una instancia de esa clase. Puedo ver, por ejemplo, un dato en Python como un objeto (¡ojo! no en todos los lenguajes de programación puede darse este paralelismo). Así que cada vez que definimos una variable int, float, boolean, file, etc. estamos en realidad definiendo un objeto de un tipo determinado. Los tipos no son más que clases de objetos predefinidas en Python.
= = =
Para conocer el tipo de una variable ya sabemos que usamos type. Para conocer sus atributos y métodos, usamos dir. La salida dir del ejemplo anterior es:
>>> print dir(cadena)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
En esta salida están los métodos y atributos mezclados. Algunos, como __add__ aparecen enmarcados en dos subrayados bajos, y son especiales. Veremos después su utilidad.
Para conocer si en particular alguno es un método o un atributo, usamos la orden type, pero particularizada:
>>> print type(cadena.index)
<type 'builtin_function_or_method'>
Devolviendo si es un método "builtin_function_or_method" y si es atributo, de qué tipo es.
= = =
Si un método es específico de un tipo, la notación es variable.método([parámetros],) es decir, el nombre de la variable, un punto, el método y los modificadores o parámetros necesarios. Si es un método más global, compartido por varios tipos, se utiliza la notación método(variable).
# *-* coding:utf-8 *-*

cadena = "Hola Mundo"
a = ["0","1","hola"]

print cadena.upper()
# print a.upper()
# no se puede hacer a.upper() porque ese método 
# no existe tuplas

print len(cadena)
print len(a)

No hay comentarios:

Publicar un comentario