OOP

declaraciones de clases

Una clase genera multiples instancias de objetos, en OOP(Python) hay class object and instance object:

* class object provee el comportamiento default 
* instance objetc son los objetos reales 

In [1]:
#palabra reservada class
class FirstClass: #Definimos una nueva clase
    
    def setdata(self, value): #definimos un metodo de la clase
        self.data = value #self hace mencion a la instancia

    def display(self):         
        print self.data

In [2]:
#creamos una instancia de FirstClass
primera_clase = FirstClass()

In [3]:
#seteamos el atributo de FirstClass
primera_clase.setdata("37")

In [4]:
#ejecutamos el metodo del objeto
primera_clase.display()


37

Por como definimos la clase, podemos agregar los atributos que queramos, osea que no son privados


In [5]:
#agregamos un atributo al objeto que no estaba en la clase base
primera_clase.atr = 73

Segundo ejemplo, donde creamos una segunda clase que es subclase de la anterior. Por ello hereda todos los metodos y atributos, además redefinimos el metodo display


In [6]:
class SecondClass(FirstClass): #subclase(superclase1, superclase2, ....):
    def display(self): #redefinimos display 
        print 'El valor actual = ', self.data

In [7]:
segunda_clase = SecondClass()

In [8]:
segunda_clase.setdata(73)

In [9]:
segunda_clase.display()


El valor actual =  73

Operator overloading

Existen metodos especiales

__X__()
__add__()
__init__()

que son fijos para todas las clases, estos metodos especiales nos permiten integrar de manera natural todos los objetos y las clases ya existentes es lo que se conoce como automatic dispatch mechanism (mecanismo de envío automático): Por ejemplo esto nos permite definir como debe ser la suma de dos clases, como debe ser el slicing de un objeto.... etc

Vamos a implementar una tercera clase que sera subclase de la segunda y además vamos a agregar algunos operadores


In [10]:
class ThirdClass(SecondClass):
    def __init__(self, value): #constructor
        self.data = value
     
    def __add__(self, other): #metodo para suma de dos objetos ThirdClass
        return ThirdClass(self.data + other)
    
    def __str__(self): #metodo para imprimir el objeto
        return '[ThirdClass: %s]' % self.data
    
    def mul(self, other): #metodo para multiplicar dos objetos ThirdClass
        self.data *= other

In [11]:
tercera_clase = ThirdClass('abs')

In [12]:
tercera_clase.display() #lo que heredo de SecondClass


El valor actual =  abs

In [13]:
print tercera_clase #aca llama al metodo __str__


[ThirdClass: abs]

In [14]:
tercera_clase.mul(7)

In [15]:
print tercera_clase


[ThirdClass: absabsabsabsabsabsabs]

In [16]:
b = tercera_clase + 'hola' #b es ahora una instancia de ThirdClass

In [17]:
print b


[ThirdClass: absabsabsabsabsabsabshola]

Ahora vamos a hacer unos ejemplos más realistas, vamos a modelar una persona y un gerente, pero los vamos a colocar a todas las clases en un archivo aparte


In [18]:
# corremos el archivo donde esta la clase Person
%run person.py


Martin Noblia 0
Sue Jones 10000

In [19]:
%whos


Variable        Type                    Data/Info
-------------------------------------------------
FirstClass      classobj                __main__.FirstClass
Person          classobj                __main__.Person
SecondClass     classobj                __main__.SecondClass
ThirdClass      classobj                __main__.ThirdClass
b               __main__.ThirdClass     [ThirdClass: absabsabsabsabsabsabshola]
martin          __main__.Person         <__main__.Person instance at 0x29884d0>
primera_clase   __main__.FirstClass     <__main__.FirstClass instance at 0x2980ef0>
segunda_clase   __main__.SecondClass    <__main__.SecondClass instance at 0x2988248>
sue             __main__.Person         <__main__.Person instance at 0x2988488>
tercera_clase   __main__.ThirdClass     [ThirdClass: absabsabsabsabsabsabs]

In [20]:
#Realizamos una nueva clase ahora con nuevos metodos
%run person2.py


Bob Smith 0
Sue Jones 10000
Smith
11000

In [21]:
#Agregamos un nuevo metodo(built-in) para mostrarlo por pantalla
%run person3.py


[Person: Bob Smith, 0]
[Person: Sue Jones, 1000]
Smith Jones
1100

In [21]: