Diferencia entre revisiones de «Curso Python DGA 2011/inmersion python/contenidos/slides2»
De WikiEducator
(Página creada con '{{TEP}}') |
(→La clase como arquetipo del objeto.) |
||
| (7 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 1: | Línea 1: | ||
| − | {{ | + | {{#widget:Slides}} |
| + | <div class="slides layout-regular template-default"> | ||
| + | <div class="slide"> | ||
| + | = Inmersión en Python II= | ||
| + | == Clases y Objetos == | ||
| + | Luis Miguel Morillas <lmorillas at xml3k.org> | ||
| + | |||
| + | identi.ca: lmorillas | ||
| + | </div> | ||
| + | <div class="slide"> | ||
| + | === ¿Qué son? === | ||
| + | * Un objeto es una entidad que agrupa un estado y una funcionalidad relacionadas. | ||
| + | * En Python un objeto es un conjunto de atributos | ||
| + | * Una clase permite crear nuevos objetos que comparten los mismos atributos | ||
| + | * Muy importantes para optimizar/reutilizar mejor el código | ||
| + | </div> | ||
| + | <div class="slide"> | ||
| + | === En Python todo son objetos === | ||
| + | <source lang="python"> | ||
| + | print (123).__class__ | ||
| + | print zip.__class__ | ||
| + | print list.__class__ | ||
| + | import os ; print os.__class__ | ||
| + | </source> | ||
| + | |||
| + | Y todo objeto tiene una clase. | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | === La clase como arquetipo del objeto. === | ||
| + | |||
| + | <source lang="python"> | ||
| + | |||
| + | class Estudiante(object): | ||
| + | def __init__(self, nombre, edad): | ||
| + | self.nombre = nombre | ||
| + | self.edad = edad | ||
| + | maria = Estudiante('María', 19) | ||
| + | print maria.nombre | ||
| + | </source> | ||
| + | |||
| + | <source lang="python"> | ||
| + | class <Nombre de la Clase>(Clase Padre): | ||
| + | def metodo (self, parametros): | ||
| + | ... | ||
| + | </source> | ||
| + | </div><div class="slide"> | ||
| + | |||
| + | ===self=== | ||
| + | * Explícitamente hay que usar el '''self''' al definir las clases en Python. | ||
| + | * Se refiere a la instancia concreta del objeto. | ||
| + | * Aparecerá como primer parámetro en la definición de los métodos. | ||
| + | * Pero no se usa al llamar a las clases o a los métodos. | ||
| + | * De forma automática, Python pasa la instancia del objeto. | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | |||
| + | === Clase = función=== | ||
| + | * Al ejecutar clase se produce un nuevo valor. | ||
| + | * El objeto tiene los mismos atributos que la clase salvo el operador () | ||
| + | * Inicializa el objeto con el método '''__init__''' | ||
| + | ** Le pasa objeto + parámetros a la clase. | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | === Un método es una función asociada a un objeto=== | ||
| + | <source lang="python"> | ||
| + | class Estudiante(object): | ||
| + | def __init__(self, nombre, edad): | ||
| + | self.nombre = nombre | ||
| + | self.edad = edad | ||
| + | def saluda(self): | ||
| + | return 'Hola, me llamo %s' % self.nombre | ||
| + | |||
| + | maria = Estudiante('María', 19) | ||
| + | print maria.saluda() | ||
| + | </source> | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | === El método en detalle === | ||
| + | * Primer parametro es la instancia. | ||
| + | * self por convención | ||
| + | * Todas las clases heredan de object | ||
| + | * Los atributos pueden añadirse, borrarse, modificarse, en cualquier momento | ||
| + | * En Python todo es público | ||
| + | * Por convención, lo privado empieza por '''_''' | ||
| + | Ejemplo: self._atributo | ||
| + | * ¡Python no es Java!: '''No "setters" y "getters"''' | ||
| + | <source lang="python"> | ||
| + | maria.edad += 1 | ||
| + | </source> | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | |||
| + | === Herencia=== | ||
| + | <source lang="python"> | ||
| + | class Base (object): | ||
| + | def method(self): | ||
| + | print "base.method()" | ||
| + | |||
| + | class Deriv (Base): | ||
| + | def method ( self ): | ||
| + | print "deriv.method()" | ||
| + | def other (self): | ||
| + | print "deriv.other()" # método añadido | ||
| + | </source> | ||
| + | |||
| + | |||
| + | </div><div class="slide"> | ||
| + | === Herencia con parámetros === | ||
| + | * Si el padre necesitaba parámetros, hay que llamar a su método '''__init__''' | ||
| + | <source lang="python"> | ||
| + | class Persona(object): | ||
| + | def __init__(self, nombre): | ||
| + | self.nombre = nombre | ||
| + | |||
| + | class Estudiante(Persona): | ||
| + | def __init__(self, nombre, curso): | ||
| + | super(Estudiante, self).__init__(nombre) | ||
| + | self.curso = curso | ||
| + | </source> | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | |||
| + | === Métodos especiales === | ||
| + | <source lang="python"> | ||
| + | __init__(self, ...) | ||
| + | __new__(cls, args) | ||
| + | __del__(self) | ||
| + | __str__(self) | ||
| + | __cmp__(self, otro) | ||
| + | __len__(self) | ||
| + | __getitem__(self, key) | ||
| + | __setitem__(self, key, valor) | ||
| + | ... | ||
| + | </source> | ||
| + | |||
| + | </div><div class="slide"> | ||
| + | === Ejemplos de métodos especiales === | ||
| + | <source lang="python"> | ||
| + | class Estudiante(object): | ||
| + | def __init__(self, nombre, edad): | ||
| + | self.nombre = nombre | ||
| + | self.edad = edad | ||
| + | def saluda(self): | ||
| + | return 'Hola, me llamo %s' % self.nombre | ||
| + | def __str__(self): | ||
| + | return self.nombre | ||
| + | def __repr__(self): | ||
| + | return self.nombre | ||
| + | def __cmp__(self, per): | ||
| + | '''p es otro objeto de tipo persona''' | ||
| + | return cmp(self.nombre, per.nombre) | ||
| + | |||
| + | if __name__ == '__main__': | ||
| + | maria = Estudiante('María', 19) | ||
| + | luis = Estudiante('Luis', 21) | ||
| + | ana = Estudiante('Ana', 23) | ||
| + | estudiantes = [maria, luis, ana] | ||
| + | print sorted(estudiantes) | ||
| + | </source> | ||
| + | |||
| + | </div> | ||
| + | </div> | ||
| + | |||
| + | <div id="weSlideLogo" class="nav"> | ||
| + | '''Inmersión en Python''' [[image:Python-logo.png|200px]] | ||
| + | </div> | ||