Repaso
              OOP en Python




  Curso de Introducción a Python
                           Clase 3


         Defossé Nahuel, Pecile Lautaro

                           UNPSJB


                    Septiembre 2012




Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso
                                               Tipos de datos inmutables
                            OOP en Python


Sintaxis de Python



      Python posee una sintaxis bastante flexible, por lo cual, a
      veces se pueden escribir onliners o código poco legible.
      Para esto existen herramientas de checkeo de sintaxis
        1   PEP8
        2   PyFlakes
        3   PyLint
      Todos son configurables sobre que puede ser considerado mal
      visto y están integrados en varias IDEs como Spyder, PyDev,
      Eric, PyCharm, vim-python, etc.




              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso
                                              Tipos de datos inmutables
                           OOP en Python




Los tipo de datos inmutables son aquellos que no pueden cambiar
de valor a menos que se cree uno nuevo:
       str Cadena, ej: ”Hola mundo!”
       int y float Enteros ej: 42 0.3
       NoneType representa el vacío None
       bool solo existen dos instancias True y False
       tuple las tuplas son colecciones ordenadas de objetos, por
       ejemplo (1, 2, −2) ó ( Hola mundo , Python ) 1




   1
    Las tuplas además se usan para asignación múltiple y para retorno de
múltiple
             Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso
                                              Tipos de datos inmutables
                           OOP en Python


Tipos de datos mutables



      set Representa un conjunto, donde no se pueden repetir
      elementos.
      list Una lista contiene cualquier tipo de elementos y es
      dinámica. Ej: [ a , 1, 2]
      dict El diccionario es una tabla de asociación clave→valor.
      Ej:
      d = {’caballeros’:[’Arturo’, ’Lancelot’, ’Gallahad’],
           ’mosqueteros’:[’Aramis’, ’Athos’, ’Portos’]
           }




             Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                    OOP en Python      Metodos estáticos y de clase




En esta clase nos dedicaremos por enteros a OOP.
Refrescaremos conceptos ya vistos y conoceremos algunos
nuevos.




      Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                          OOP en Python      Metodos estáticos y de clase


Objetos




      Los objetos son la abstracción de Python para los datos.
      Todo dato en Python está representado por un objeto o alguna
      relación entre dos o más objetos.
      Todo objeto posee una identidad, un tipo y un valor.




            Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                           OOP en Python      Metodos estáticos y de clase


Identidad




       La identidad de un objeto nunca cambia una vez que ha sido
       creado.
       Para trabajar con la identidad, disponemos de la función id()
       y del operador is.
       Dos objetos diferentes pueden tener el mismo valor. Pero esto
       depende de la implementación de Python que estemos usando.




             Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                            OOP en Python      Metodos estáticos y de clase


Tipo




       El tipo de un objeto determina las operaciones que podemos
       realizar sobre este, y también define el conjunto de valores que
       puede adquirir.
       La función type() devuelve el tipo del objeto.




              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                           OOP en Python      Metodos estáticos y de clase


Valor




   El valor de un objeto puede cambiar.
   Un objeto se denomina mutable o inmutable según cambie o no de
   valor respectivamente.
   La mutabilidad de un objeto queda definida por su tipo.




             Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                            OOP en Python      Metodos estáticos y de clase


Herencia Múltiple




   En Python, la herencia puede ser múltiple.
   En caso de que haya métodos con la misma signatura en los padres,
   tiene prioridad el perteneciente a la primera clase padre mencionada
   en la declaración de la clase hija.




              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                          OOP en Python      Metodos estáticos y de clase


Polimorfismo




      Polimorfismo es la capacidad que tiene un método de saber
      actuar ante diferentes mensajes que puede recibir de otros
      objetos o de sí mismo.
      Duck-typing (tipado de pato): “si flota como pato y hace
      ’cuak!’ como un pato entonces es un pato”.




            Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                            OOP en Python      Metodos estáticos y de clase


Sobrecarga de operadores




   Python posee un conjunto especial de nombres de método que
   serán llamados ante determinados operadores o funciones que se
   apliquen sobre los objetos.
   Estos métodos especiales nos permiten personalizar el
   comportamiento del lenguage y ampliar de manera práctica las
   posiblidades del mismo.




              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                            OOP en Python      Metodos estáticos y de clase


Propiedades
   En Python el acceso a los atributos tanto de una clase como de una
   instancia se hace con el operador punto .
   A veces es necesario controlar el acceso a ciertos atributos, por
   ejemplo
   from datetime import datetime

   class Persona(object):
       def __init__(self, nombre, nacimiento):
           self.nombre = nombre
           self.nacimiento = nacimiento

       def edad(self):
           ’’’Retorna la edad de la persona’’’
           return (datetime.today() -
                   self.nacimiento).days / 365
              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                                OOP en Python      Metodos estáticos y de clase


Propiedaes


   Sería desable acceder a la edad como si se tratase de un atributo,
   aunque deba calcularse. Para esto podemos usar una propiedad 2 :

          @property
          def edad(self):
              ’’’Retorna la edad de la persona’’’
              return (datetime.today() - nacimiento) / 365
   De esta manera podemos hacer
   p = Persona("Eduardo", date(1976, 1, 4))
   p.edad # en vez de p.edad()


     2
         El caracter @ se usa para decorar código
                  Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                            OOP en Python      Metodos estáticos y de clase


Propiedades como getter/setter

   Las propiedades se comportan como los getters/setters de otros
   lenguajes y no es necesario cambiar la forma de acceso a los
   atributos!
   Supongamos que debemos controlar el valor con asignado a un
   atributo de una instancia, en este ejemplo no hay control sobre los
   valores:
   class PuntoGeo(object):
       def __init__(self, lat, lng):
           ’’’ Latitud y longitud ’’’
           self.lat = lat
           self.lng = lng
       def __str__(self):
           return "%.3f %.3f" % (self.lat, self.lng)

              Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                         OOP en Python      Metodos estáticos y de clase




Para definir el setter usamos el siguiente decorador:
     _lat = None
     @property
     def lat(self):
         return self._lat
     @lat.setter
     def lat(self, value):
         if not -90 <= value <= 90:
             raise ValueError("Valor fuera de rango"
                              ": %s" % value)
         self._lat = value
De esta manera accedemos al primer método como getter cuando
pedimos la latitud y al segundo cuando se la asignamos.
No es necesario usar setLat(valor)


           Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                          OOP en Python      Metodos estáticos y de clase


Métodos de clase




      En Python los atributos estáticos se definen con el decorador
      @classmethod , estos reciben la clase en vez de la instancia
      como su primer argumento.
      class A(object):
          @classmethod
          def metodo_de_clase(cls):
              print "No necesito ser instanciado"




            Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python
Repaso      Objetos
                          OOP en Python      Metodos estáticos y de clase


Métodos estáticos



      Los métodos estáticos en Python son aquellos que no reciben
      nada como primer argumento. Se comportan como funciones
      bajo el ámbito de nombres de la clase.
      class B(object):
          @staticmethod
          def metodo_estatico():
              print "Soy una funcion comun "
                    "dentro de una clase"




            Defossé Nahuel, Pecile Lautaro   Curso de Introducción a Python

Clase 3/4 Curso Introducción a Python 2012

  • 1.
    Repaso OOP en Python Curso de Introducción a Python Clase 3 Defossé Nahuel, Pecile Lautaro UNPSJB Septiembre 2012 Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 2.
    Repaso Tipos de datos inmutables OOP en Python Sintaxis de Python Python posee una sintaxis bastante flexible, por lo cual, a veces se pueden escribir onliners o código poco legible. Para esto existen herramientas de checkeo de sintaxis 1 PEP8 2 PyFlakes 3 PyLint Todos son configurables sobre que puede ser considerado mal visto y están integrados en varias IDEs como Spyder, PyDev, Eric, PyCharm, vim-python, etc. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 3.
    Repaso Tipos de datos inmutables OOP en Python Los tipo de datos inmutables son aquellos que no pueden cambiar de valor a menos que se cree uno nuevo: str Cadena, ej: ”Hola mundo!” int y float Enteros ej: 42 0.3 NoneType representa el vacío None bool solo existen dos instancias True y False tuple las tuplas son colecciones ordenadas de objetos, por ejemplo (1, 2, −2) ó ( Hola mundo , Python ) 1 1 Las tuplas además se usan para asignación múltiple y para retorno de múltiple Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 4.
    Repaso Tipos de datos inmutables OOP en Python Tipos de datos mutables set Representa un conjunto, donde no se pueden repetir elementos. list Una lista contiene cualquier tipo de elementos y es dinámica. Ej: [ a , 1, 2] dict El diccionario es una tabla de asociación clave→valor. Ej: d = {’caballeros’:[’Arturo’, ’Lancelot’, ’Gallahad’], ’mosqueteros’:[’Aramis’, ’Athos’, ’Portos’] } Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 5.
    Repaso Objetos OOP en Python Metodos estáticos y de clase En esta clase nos dedicaremos por enteros a OOP. Refrescaremos conceptos ya vistos y conoceremos algunos nuevos. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 6.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Objetos Los objetos son la abstracción de Python para los datos. Todo dato en Python está representado por un objeto o alguna relación entre dos o más objetos. Todo objeto posee una identidad, un tipo y un valor. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 7.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Identidad La identidad de un objeto nunca cambia una vez que ha sido creado. Para trabajar con la identidad, disponemos de la función id() y del operador is. Dos objetos diferentes pueden tener el mismo valor. Pero esto depende de la implementación de Python que estemos usando. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 8.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Tipo El tipo de un objeto determina las operaciones que podemos realizar sobre este, y también define el conjunto de valores que puede adquirir. La función type() devuelve el tipo del objeto. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 9.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Valor El valor de un objeto puede cambiar. Un objeto se denomina mutable o inmutable según cambie o no de valor respectivamente. La mutabilidad de un objeto queda definida por su tipo. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 10.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Herencia Múltiple En Python, la herencia puede ser múltiple. En caso de que haya métodos con la misma signatura en los padres, tiene prioridad el perteneciente a la primera clase padre mencionada en la declaración de la clase hija. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 11.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Polimorfismo Polimorfismo es la capacidad que tiene un método de saber actuar ante diferentes mensajes que puede recibir de otros objetos o de sí mismo. Duck-typing (tipado de pato): “si flota como pato y hace ’cuak!’ como un pato entonces es un pato”. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 12.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Sobrecarga de operadores Python posee un conjunto especial de nombres de método que serán llamados ante determinados operadores o funciones que se apliquen sobre los objetos. Estos métodos especiales nos permiten personalizar el comportamiento del lenguage y ampliar de manera práctica las posiblidades del mismo. Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 13.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Propiedades En Python el acceso a los atributos tanto de una clase como de una instancia se hace con el operador punto . A veces es necesario controlar el acceso a ciertos atributos, por ejemplo from datetime import datetime class Persona(object): def __init__(self, nombre, nacimiento): self.nombre = nombre self.nacimiento = nacimiento def edad(self): ’’’Retorna la edad de la persona’’’ return (datetime.today() - self.nacimiento).days / 365 Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 14.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Propiedaes Sería desable acceder a la edad como si se tratase de un atributo, aunque deba calcularse. Para esto podemos usar una propiedad 2 : @property def edad(self): ’’’Retorna la edad de la persona’’’ return (datetime.today() - nacimiento) / 365 De esta manera podemos hacer p = Persona("Eduardo", date(1976, 1, 4)) p.edad # en vez de p.edad() 2 El caracter @ se usa para decorar código Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 15.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Propiedades como getter/setter Las propiedades se comportan como los getters/setters de otros lenguajes y no es necesario cambiar la forma de acceso a los atributos! Supongamos que debemos controlar el valor con asignado a un atributo de una instancia, en este ejemplo no hay control sobre los valores: class PuntoGeo(object): def __init__(self, lat, lng): ’’’ Latitud y longitud ’’’ self.lat = lat self.lng = lng def __str__(self): return "%.3f %.3f" % (self.lat, self.lng) Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 16.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Para definir el setter usamos el siguiente decorador: _lat = None @property def lat(self): return self._lat @lat.setter def lat(self, value): if not -90 <= value <= 90: raise ValueError("Valor fuera de rango" ": %s" % value) self._lat = value De esta manera accedemos al primer método como getter cuando pedimos la latitud y al segundo cuando se la asignamos. No es necesario usar setLat(valor) Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 17.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Métodos de clase En Python los atributos estáticos se definen con el decorador @classmethod , estos reciben la clase en vez de la instancia como su primer argumento. class A(object): @classmethod def metodo_de_clase(cls): print "No necesito ser instanciado" Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python
  • 18.
    Repaso Objetos OOP en Python Metodos estáticos y de clase Métodos estáticos Los métodos estáticos en Python son aquellos que no reciben nada como primer argumento. Se comportan como funciones bajo el ámbito de nombres de la clase. class B(object): @staticmethod def metodo_estatico(): print "Soy una funcion comun " "dentro de una clase" Defossé Nahuel, Pecile Lautaro Curso de Introducción a Python