Diferencia entre revisiones de «Usuario:Lmorillas/modulo programacion/python/intro clases»

De WikiEducator
Saltar a: navegación, buscar
(Página creada con '{{DISPLAYTITLE:Clases y Objetos}} == ¿Qué son? == * Un objeto es una entidad que agrupa un estado y una funcionalidad relacionadas. * En Python un objeto es un conjunto de a…')
 
 
(Una revisión intermedia por el mismo usuario no mostrado)
Línea 177: Línea 177:
 
Invocado desde la clase <class '__main__.ObjetoHijo'>  
 
Invocado desde la clase <class '__main__.ObjetoHijo'>  
 
</source>
 
</source>
 +
 +
 +
== Ejercicios ==
 +
{{/ejercicio boton}}
 +
 +
{{/ejercicio dado}}
 +
 +
=== Más ejercicios ===
 +
[[/ejercicios clases | Ejercicios clases y poo]]

Última revisión de 22:44 25 ene 2012


¿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

En Python todo son objetos

print (123).__class__
print zip.__class__
print list.__class__
import os ; print os.__class__

Y todo objeto tiene una clase.

Clase = Arquetipo del objeto.

class Estudiante(object):
    def __init__(self, nombre, edad):
        self.nombre = nombre
        self.edad = edad
maria = Estudiante('María', 19)
print maria.nombre

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.

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.

Métodos

Un método es una función asociada a un objeto

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()
  • 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"
maria.edad += 1

Método __init__

Es un método opcional. Se usará cuando hay que inicializar datos.

Herencia

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
  • Si el padre necesitaba parámetros, hay que llamar a su método __init__
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

Métodos especiales

  __init__(self, ...)
  __new__(cls, args)
  __del__(self)
  __str__(self)
  __cmp__(self, otro)
  __len__(self)
  __getitem__(self, key)
  __setitem__(self, key, valor)
  ...
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)

Métodos estáticos

En Python los métodos estáticos se usan mucho menos que en Java porque se pueden crear funciones estándar en los módulos. En java un método estático y un método de clase son lo mismo. En Python no. Supón que a() es una función definida en la clase Madre. Cuando una clase hija hereda:

  • Si a() es un @staticmethod, Hija.a() se refiere a la definición de la clase Madre.
  • Si a() es un @classmethod, Hija.a() apunta a la definición de la subclase.

Es decir:

  • @staticmethod es una función definida dentro de una clase. Se puede llamar sin haber instanciado la clase antes. Su definición es inmutable por herencia.
  • @classmethod es una función que a la que se puede llamar sin instanciar la clase, pero su definición sigue la subclase, no a la clase madre via herencia. Por eso su primer argumento es cls (class).
class Objeto(object):
   contador = 0   # contador es un atributo estático
   def __init__(self, valor):
      self.valor = valor
      Objeto.contador += 1
   @staticmethod
   def total():
      return Objeto.contador
 
uno = Objeto('Primero')
dos = Objeto('Segundo')
tres = Objeto('Tercero')
 
print 'Hemos creado', Objeto.total(), 'objetos.'
print 'Soy el objeto', dos.valor, 'de', dos.total(), 'objetos.'

Salida:

Hemos creado 3 objetos.
Soy el objeto Segundo de 3 objetos.
class Objeto(object):
    @classmethod
    def metodo_de_clase(cls):
        print "Invocado desde la clase %s " % cls
class ObjetoHijo(Objeto):
    pass

Ejemplo de uso:

>>> Objeto.metodo_de_clase()
Invocado desde la clase <class '__main__.Objeto'> 
>>> ObjetoHijo.metodo_de_clase()
Invocado desde la clase <class '__main__.ObjetoHijo'> 
>>> o = Objeto()
>>> o.metodo_de_clase()
Invocado desde la clase <class '__main__.Objeto'> 
>>> h = ObjetoHijo()
>>> h.metodo_de_clase()
Invocado desde la clase <class '__main__.ObjetoHijo'>


Ejercicios

Creación de un botón para graphics.py

Icon activity.jpg

Creación de un botón para graphics.py


Icon objectives.jpg

Objetivo

  • Crea un Botón para graphics
  • Al iniciar el botón le daremos los datos de la ventana, el punto donde va a estar centrado, su anchura, altura y etiqueta.
  • Tendrá un método (pulsado(p)) que devolverá verdadero si el punto p está dentro del botón y falso de lo contrario
  • Tendrá un método(activar()) que permitirá activar el botón.
  • Tendrá un método(desactivar()) que permitirá desactivar el botón. Por defecto cuando se crea un botón estará desactivado. El fondo del botón desactivado será gris.
  • Cuando pulsemos el botón cambiará de activado a desactivado (o al revés)







Clase Dado

Icon activity.jpg

Clase Dado


Icon objectives.jpg

Objetivo

  • Crea una clase dado que permita crear dados gráficos con graphics
  • Al crear un dado, le daremos la información de la ventana donde se pinta, el punto del centro del dado y su tamaño (en pixeles)
  • El dado tendrá un método (ponValor(valor)) que asignará un valor numérico al dado y pintará los puntitos en la cara visible
Icon present.gif
Tip: Cuando creas el dado puedes crear ya los 7 puntos que permiten pintar los valores de 1 a 6. Cuando asignas el valor, borras todos (píntalos del color del fondo) y vuelve a pintar los que te interesan.







Juego dados

Icon activity.jpg

Juego dados

Usando la clase dado anterior, haz un programa que simule un juego de dados: http://es.wikipedia.org/wiki/Categor%C3%ADa:Juegos_de_dados


Icon key points.gif

Puntos clave

  • El código del juego se almacenará en un gestor de versiones (mercurial) (1 pto.)
  • Los commits tienen comentarios adecuados (1 pto.)
  • Estará debidamente documentado con docstring (1 punto)
  • Hay un archivo leame con la descripción del proyecto (1 punto)
  • Escrito en python con una interfaz gráfica (1 puntos)
  • Usa la clase Dado (2)
  • Diseño modular (1)
  • Es funcional (2)







Más ejercicios

Ejercicios clases y poo